GCC是否内联C++;不带';内联';关键词? P> GCC,编译C++代码时,是否尝试通过选择内联的未标记为“ < /COD>关键字”的函数?< /p> < p>是的,特别是如果您启用了高级别的优化。

GCC是否内联C++;不带';内联';关键词? P> GCC,编译C++代码时,是否尝试通过选择内联的未标记为“ < /COD>关键字”的函数?< /p> < p>是的,特别是如果您启用了高级别的优化。,c++,optimization,gcc,inline,optimizer-hints,C++,Optimization,Gcc,Inline,Optimizer Hints,您可以向编译器提供一个标志来禁用此功能:-fno内联函数。是。任何编译器只要认为这是个好主意,就可以自由地内联任何函数。GCC也这样做 在-O2优化级别,当编译器认为内联是值得做的(使用启发式)并且不会增加代码的大小时,内联就完成了。在-O3中,只要编译器认为它值得做,不管它是否会增加代码的大小,它都会做。此外,在所有优化级别(即启用优化),只调用一次的静态函数都是内联的 如下面的注释所述,这些-Ox实际上是包含多个更具体设置的复合设置,包括与内联相关的设置(如-finline函数等),因此也可

您可以向编译器提供一个标志来禁用此功能:-fno内联函数。

是。任何编译器只要认为这是个好主意,就可以自由地内联任何函数。GCC也这样做

-O2
优化级别,当编译器认为内联是值得做的(使用启发式)并且不会增加代码的大小时,内联就完成了。在
-O3
中,只要编译器认为它值得做,不管它是否会增加代码的大小,它都会做。此外,在所有优化级别(即启用优化),只调用一次的静态函数都是内联的


如下面的注释所述,这些
-Ox
实际上是包含多个更具体设置的复合设置,包括与内联相关的设置(如
-finline函数
等),因此也可以描述行为(并控制它)就那些更具体的设置而言。

如果使用“-finline函数”或“-O3”,则将使用内联函数。您还可以使用'-finline_limit=N'来调整它的内联量。

是的,它会,尽管它也会为非
静态
内联
函数生成一个非内联函数体,因为来自其他转换单元的调用需要这个函数体


对于
内联
函数,如果函数在任何特定的翻译单元中使用,则无法提供函数体是错误的,因此这不是问题。

实际上,-fno内联函数抑制自动内联,而-fno内联函数根据规范抑制所有内联(源:),C++中的<代码>内联关键字与同名的编译器优化无关。关键字仅仅意味着链接器应该看到函数的多个定义。这恰好使内联优化更容易(因为完整的定义可以在多个翻译单元中显示),但这是最接近的。编译器可以内联未标记为
inline
的函数,并且标记为
inline
的函数不一定由编译器内联。请注意,类定义内定义的方法(即
{…};
默认情况下是
内联的
,即使没有关键字。GCC说关于
-finline函数
“考虑所有函数进行内联,即使它们没有声明为内联。”我推断,使用
inline
声明的函数将被视为内联函数,即使它们使代码大小变大?许多人声称
inline
给编译器的提示已过时。但这意味着使用
-O2
时,提示不会过时,因为它只会生成代码的内联函数如果他们有
inline
关键字,则会变大。但是如果
-O3
它将过时(我的意思是提示…inline关键字有其他用途)。我在创建一个太大的函数时遇到了问题,无法与
-O2
内联。我创建的每个与-O3内联的函数也都与-O2内联。GCC关于
-finline small function
说:“当函数体小于预期的函数调用代码时,将函数集成到它们的调用者中。”(因此程序的总体大小变小了)”。然而,当我查看程序集时,即使使用-O2,它也会明显地使代码变大。你有O3内联但O2不内联的例子吗?@AnT如何防止编译器内联一个只调用一次的函数。