如果您在编译器中启用了完全优化并设置了如下类:classA{voidDo_A_Stuff();};classB{Aa;voidDo_B_Stuff(){a.Do_A_Stuff();}};classC{Bb;voidDo_C_Stuff(){b.Do_B_Stuff();}};classD{Cc;voidDo_D_Stuff(){c.Do_C_Stuff();}};是否存在调用Do_D_Stuff()比直接调用Do_A_Stuff()慢的情况?此外,这是否需要在每个包装器“链”上使用inline关键字,或者,由于这只是一个建议,编译器是否可以决定在没有关键字的情况下对其进行优化?我知道
如果它们是内联的,我就能理解它是如何工作的。但如果不是,它是如何工作的?是否所有目标文件都有自己的拷贝,例如函数模板? 最佳答案 模板将按照inline的标准含义进行内联,这与OneDefinitionRule的关系比与实际代码内联的关系更大。也就是说,如果模板函数在多个翻译单元中定义,链接器不会提示,它只会选择一个(注意:随机一个,如果您在不同翻译单元中提供模板的不同定义,当前编译器不会提示!)并将其保留在最终的二进制文件中。现在,与所有其他inline函数一样,编译器可以决定实际避免函数调用并在调用位置内联函数是个好主意,或者它
我总是尝试将实现保持在header之外,因此对于模板和内联函数,我通常会这样做//File.hinlineboolfoo()#include"File.hpp"//File.hppinlineboolfoo(){return1;}我的问题是,对于函数的实际实现重复inline关键字,C++规范有什么规定?(如本例所示)我真的不想这样做,因为它会因为很多函数而变得困惑,虽然我的编译器没有提示,但我想知道编译器是否仍然接受内联提示。有人知道吗? 最佳答案 我倾向于将inline放在尽可能远离接口(interface)的地方,因为它是一个
也许有人可以帮助我理解。为什么会出现这个错误。我正在尝试构建使用Inline::CPP的C++代码。例子如下:#!/usr/bin/envperlpackagemainv0.1.0;usestrict;usewarnings;useInline(CPP=>CPP#ccflags=>'-std=c++11',ccflags=>'-std=gnu++11',clean_after_build=>0,clean_build_area=>0,);1;__END__此代码在linux下编译没有错误,但在strawberryperl5.26.2x64下会产生以下错误:"D:\devel\perl\
根据标准,外部内联函数在所有翻译单元中必须具有相同的地址。这是如何在编译器中实现的?我的意思是当我编译一些翻译单元时,我不知道其他TU会是什么样子。那么我怎样才能在所有地方使用相同的地址呢? 最佳答案 这取决于实现,但通常由链接器解决。每个编译的翻译单元将生成一个包含函数拷贝的目标文件,以某种方式标记,以便链接器知道它应该期望(并接受)拷贝。链接器将包含其中一个,丢弃其他,并解析对该函数的任何引用。 关于c++-外部内联函数在所有翻译单元中必须具有相同的地址。这到底是如何实现的?,我们在
如果我将函数设为内联,它是否会将其链接更改为内部链接?例如:我在两个文件中使用或调用内联函数:file1.cpp//functiondefinitioninlinevoidfoo(){}file2.cpp//functiondefinitioninlinevoidfoo(){}为什么我需要在每个文件中定义内联函数才能调用它?我得到一个内部链接?如果我使用staticinline会怎样? 最佳答案 IfImakeafunctioninlinedoesitchangeitslinkagetointernallinkage?不,将其内联并
使用完全优化的VS2010/Ox查看以下两个函数调用:staticstringtest1(conststring&input){returninput;}staticvoidtest2(conststring&input,string&output){output=input;}如果我使用后一个test2,那么函数总是被优化掉并且代码被内联。但是,除非我关闭异常,否则不会内联test1。有人知道为什么吗?此外,如果编译器使用返回值优化,我希望编译器能够在test1中像test2一样高效地工作,但它似乎没有这样做。这也是我的困惑。我想使用第一个函数签名的原因是我有该函数的两个可编译版本。
在什么情况下,内联函数不再是内联函数,而是充当任何其他函数? 最佳答案 神话:inline只是一个建议,编译器可能会或可能不会遵守。一个好的编译器无论如何都会做需要做的事情。真相:inline通常向实现表明在调用点对函数体的内联替换优于通常的函数调用机制。不需要实现在调用点执行此内联替换;然而,即使省略了这个inline替换,inline的其他规则(尤其是w.r.tOneDefinitionRule)也会遵循。UnderWhatconditionaninlinefunctionceasestobeaninlinefunctionan
我喜欢在列表上编写函数检查。为此,我通常编写如下函数:inlineboolgood_strings(conststd::vector&items){for(iinitems){if(notis_good(i))returnfalse;}returntrue;}然后我可以像if(all_good({"a","b","c","d","e"})){...}这样写,它看起来非常好。当您对几个项目的支票像这样变大时,这很适合使用:if(is_good("a")andis_good("b")and/*that'stoomuch,man*/is_good("c")){...}但我担心我正在使用的容器
我正在尝试做这样的事情:structSomeStruct{constchar*bytes;constchar*desc;};SomeStructexample={{0x10,0x11,0x12,0x13},"10-13"};为什么这不起作用? 最佳答案 可能是因为{0x10,0x11,0x12,0x13}是一个char数组,而不是指向char的指针。试试SomeStructexample={"\x10\x11\x12\x13","10-13"};代替。 关于c++-如何在结构内联中分配字