草庐IT

c++ - C++ 中的内联函数 - 条件

在什么情况下,内联函数不再是内联函数,而是充当任何其他函数? 最佳答案 神话:inline只是一个建议,编译器可能会或可能不会遵守。一个好的编译器无论如何都会做需要做的事情。真相:inline通常向实现表明在调用点对函数体的内联替换优于通常的函数调用机制。不需要实现在调用点执行此内联替换;然而,即使省略了这个inline替换,inline的其他规则(尤其是w.r.tOneDefinitionRule)也会遵循。UnderWhatconditionaninlinefunctionceasestobeaninlinefunctionan

c++ - 内联函数和外部链接

在这个答案中https://stackoverflow.com/a/4193698/738811上面写着“默认情况下,内联函数具有外部链接”。但是,默认情况下不可能链接到内联的内容。那么说内联函数具有外部链接有什么意义呢? 最佳答案 名称的链接与其定义的位置或方式无关,仅与名称可用于指代特定对象或函数的位置有关。声明一个函数内联并不强制它被内联;它只是放宽了一个定义规则,以允许在使用它的每个翻译单元中都有一个定义(并且在每个调用它的翻译单元中都需要一个定义),以便更容易内联。如果编译器决定不内联对它的特定调用,或者如果您获取它的地址

c++ - 内联变量被多次初始化

我看到一些inlineconst变量在visualstudio2017中被初始化(和销毁)3次的示例。这是链接器的错误吗?或者这应该以其他方式发生?链接器Comdat折叠设置为关闭。示例代码:#pragmaoncestructA{A(){staticintcount=0;++count;ASSERT(count==1);}~A(){}};inlineconstAa=A();在我的解决方案中,我有两次触发断言(一个构造函数被调用了3次)。检查调用堆栈显示所有调用堆栈都是相同的,并且所有调用都来自a()的动态初始化程序。现在我知道这个类没有用在解决方案的其他部分,因为我创建它只是为了调查这

c++ - c++ 中内联函数的零成本列表

我喜欢在列表上编写函数检查。为此,我通常编写如下函数: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")){...}但我担心我正在使用的容器

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++-如何在结构内联中分配字

c++ - 定义一个类的私有(private)整型常量 : in the header or in the cpp file?

主题主要在此处解决(Wheretodeclare/defineclassscopeconstantsinC++?)特别是here.我想完全理解的是,在积分常数的情况下,它们之间有什么区别://IntheheaderclassA{private:staticconstintmember=0;//Declarationanddefinition};和://IntheheaderclassA{private:staticconstintmember;//Onlydeclaration};//InthecppconstintA::member=0;//Definition(据我所知,第二种可能

c++ - 函数所需的堆栈空间会影响 C/C++ 中的内联决策吗?

函数所需的大量堆栈空间会阻止它被内联吗?例如,如果我在堆栈上有一个10k的自动缓冲区,是否会降低函数被内联的可能性?intinlineme(intargs){charsvar[10000];returnstringyfunc(args,svar);}我更关心gcc,但icc和llvm也很高兴知道。我知道这并不理想,但我很好奇。代码在缓存上也可能很糟糕。 最佳答案 是的,内联与否取决于函数的复杂性、堆栈和寄存器的使用情况以及进行调用的上下文。这些规则依赖于编译器和目标平台。当性能很重要时,请始终检查生成的程序集。比较thisversi

c++ - 内联函数会导致大小增加多少?

我最近开始制作GTK+的C++包装器(没有什么特别的,只是将所有东西包装到C++类中以便于开发,供内部使用)并且对已经慢Gtk+我几乎在任何地方都使用了内联函数。看看几个类函数...classWidget:publicObject{public://Afewsamplefunctions.gwidgetistheinternalGTK+widget.voidShow(void){gtk_widget_show(GTK_WIDGET(gwidget));}voidShowNow(void){gtk_widget_show_now(GTK_WIDGET(gwidget));}voidHid

c++ - 即使没有明确定义为内联,一个非常短的函数也可以内联吗?

我事先知道,在用C或C++编写程序时,即使我将函数声明为“内联”,编译器也可以随意忽略它并决定不在每次(或任何)调用时扩展它。反之亦然吗?也就是说,如果编译器认为这样做会带来性能提升,那么编译器是否可以自动内联未定义为内联的非常短的函数?另外两个子问题:此行为是否在ANSI标准的某处定义?在这方面,C与C++是不同的,还是它们的行为相同? 最佳答案 inline对于函数是否会被编译器内联没有约束力。这本来就是它打算做的。但从那时起,人们意识到函数是否值得内联取决于函数本身和调用站点,最好由编译器来决定。来自https://en.cp

c++ - 无法使用内联功能的时间

我正在研究C++中的内联函数,并且已经谈到了有关其使用限制的部分。它说:Thecompileralsocannotperforminliningiftheaddressofthefunctionistakenimplicitlyorexplicitly.有人可以向我解释一下,或许可以举个例子,这到底是什么意思? 最佳答案 您可以将任何函数标记为内联。即使是一个虚函数,甚至是递归函数,甚至是一个非常长的函数,即使它的地址被占用。内联函数和非内联函数的主要区别在于前者的定义必须出现在使用它的每个翻译单元(又名源文件)中(这就是为什么内联