我阅读了有关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()在多个方法函数之间共享。如果慢速路径方法不
当我使用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关键字,或者,由于这只是一个建议,编译器是否可以决定在没有关键字的情况下对其进行优化?我知道
我们都知道内联函数会使调试变得更加棘手,因为它们可以从堆栈跟踪等中删除。但是假设我想从gdb中调用一个内联函数,并且我知道它的名称和参数。我认为我应该能够做到这一点,但我明白了:Cannotevaluatefunction--maybeinlined我用nm列出了我正在使用的共享库中的符号,发现我要调用的函数不在里面。没什么大惊喜。我想要的是一种生成这些内联函数的可见定义的方法。我可以访问当前包含内联定义的头文件,但我无法真正修改这些头文件。也许有某种方法可以告诉编译器发出它在翻译单元中看到的所有内联函数的定义?或者其他一些可以更轻松地在gdb中调用和检查内联函数结果的技巧?我在Lin
在我们的跨平台开源库中,我们派生自std::exception以定义可以在库代码和用户代码中捕获的自定义异常。我看到这实际上是一个推荐的过程,但在VisualStudio2015(或者更确切地说,伴随的新MSVC版本?)中,在实现类(warningC4275)中抛出警告-另请参见此处:Howtodllexportaclassderivedfromstd::runtime_error?当然我们可以忽略这个错误,但这对我来说似乎是错误的。与旧的VisualStudio版本相比,出现警告的原因似乎是std::exception曾经在旧的MSVC版本中导出,但同时不再导出。无论哪种情况,我都觉
如果它们是内联的,我就能理解它是如何工作的。但如果不是,它是如何工作的?是否所有目标文件都有自己的拷贝,例如函数模板? 最佳答案 模板将按照inline的标准含义进行内联,这与OneDefinitionRule的关系比与实际代码内联的关系更大。也就是说,如果模板函数在多个翻译单元中定义,链接器不会提示,它只会选择一个(注意:随机一个,如果您在不同翻译单元中提供模板的不同定义,当前编译器不会提示!)并将其保留在最终的二进制文件中。现在,与所有其他inline函数一样,编译器可以决定实际避免函数调用并在调用位置内联函数是个好主意,或者它