我阅读了有关namespace定义的部分。N3797的第7.3.1条说:Theinlinekeywordmaybeusedonanextension-namespace-definitiononlyifitwaspreviouslyusedontheoriginal-namespace-definitionforthatnamespace.考虑以下代码片段:namespaceM{inth;}inlinenamespaceM{intj=6;}无论使用-std=c++11还是不使用该选项,它都能成功编译。你能解释一下这种行为吗?是g++错误吗? 最佳答案
我正在学习C++入门(第5版),虽然到目前为止它确实是很棒的Material,但我发现在某些情况下我会遇到令人头疼的解释,这些解释给我的问题多于答案。在当前示例中(用粗体强调我的):Unlikeotherfunctions,inlineandconstexprfunctionsmaybedefinedmultipletimesintheprogram.Afterall,thecompilerneedsthedefinition,notjustthedeclaration,inordertoexpandthecode.However,allofthedefinitionsofagiven
假设我有以下代码:structFoo{voidhelper(){...}voidfast_path(){...;helper();...}voidslow_path1(){...;helper();...}voidslow_path2(){...;helper();...}};fast_path()方法对性能至关重要,因此应尽一切(合理的)努力使其尽可能快。slow_path1()和slow_path2()方法不是性能关键。根据我的理解,典型的编译器可能会查看此代码并决定不内联helper()如果它足够复杂,以减少总指令大小,如helper()在多个方法函数之间共享。如果慢速路径方法不
我将gcc与-finline-functions优化一起用于发布构建。为了对抗代码膨胀,因为我在嵌入式系统上工作,我想说不要内联特定功能。显而易见的方法是通过函数属性,即attribute(noinline)。问题是当我打开作为-O3开关一部分的全局-finline-functions优化时,这似乎不起作用。它也与它被模板化有关,因为同一函数的非模板化版本没有像预期的那样被内联。有人知道当这个全局开关打开时如何控制内联吗?代码如下:#include#includeusingnamespacestd;classBase{public:templatestatic_Type_fooT(_T
当我使用pimpl习惯用法时,将所有方法定义放在类定义中是个好主意吗?例如://inA.hclassA{classimpl;boost::scoped_ptrpimpl;public:A();intfoo();}//inA.cppclassA::impl{//methoddefinedinclassintfoo(){return42;}//asopposedtoonlydeclaringthemethod,anddefiningelsewhere:floatbar();};A::A():pimpl(newimpl){}intA::foo(){returnpimpl->foo();}据我
Section16.4ofC++FAQs(2ndEdition)(Paperback)byMarshallP.Cline,GregLomow表示内联函数无法安全地访问静态数据成员,因为可以在初始化静态数据成员之前调用该函数。我不明白为什么这适用于内联函数,而不仅仅是其他翻译单元中调用另一个翻译单元中的静态数据成员的函数?我看不出“内联”在这场灾难中起什么作用? 最佳答案 static变量在执行同一翻译单元(或多或少的cpp文件)中的任何函数之前完全初始化。如果main在不同的翻译单元中,它们不能保证在调用main之前被初始化。inl
考虑以下代码:constinta=0;conststd::stringb="hi";inlinevoidf_a1(){std::cout假设此代码存在于将包含在多个翻译单元中的头文件中。我对内联函数的理解是它们在每个翻译单元中必须完全相同。我对上面使用的常量的理解是,它们是隐含的static,即内部链接。这意味着每个翻译单元都有自己的拷贝。由于上面的内联函数依赖于这些常量,如果有的话,这些函数中哪些是正确的? 最佳答案 如果包含在多个翻译单元中,则唯一有效的函数是f_a1。相关子句是[basic.def.odr]/6,其中声明inl
如果您在编译器中启用了完全优化并设置了如下类: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)的地方,因为它是一个