c++ - header 中定义的函数是否保证内联?

标签 c++ inlining

如果我在头文件中定义了一个非成员函数,它会一直被编译器内联,还是编译器会根据其启发式方法进行选择?我知道 __inline 只是一个提示,它与标题中的函数一样吗?

最佳答案

请记住,在标题中包含某些内容与直接在源文件中键入内容没有什么不同。因此,就编译器而言,位于 header 中没有区别;它从来不知道它在那里。

因此,当您在头文件中定义一个函数,并将该头文件包含在一个文件中时,就好像您直接将函数键入到文件中一样。所以现在的问题是,“编译器是否选择基于启发式内联事物?”

答案是“这取决于编译器”。该标准不保证内联或不内联的内容。也就是说,任何现代编译器都会非常智能地处理它内联的内容,很可能是启发式的。

然而,我们得出了一个有趣的观点。想象一下,您在 header 中有一个函数,并将该 header 包含在多个源文件中。然后,您将在翻译单元中有多个函数定义,这违反了一个定义规则。因此,你会得到编译错误。 (链接器错误通常类似于:“错误,函数 x 已在 y 中定义”)您可以做的是使用 inline 关键字,这样您就不会再违反 ODR。

顺便说一句,__inline 是非标准的。与您的帖子相反,它通常是编译器扩展,强制 内联,而不是暗示内联。 inline 是标准关键字,原本是为了暗示内联。就像你说的,大多数现代编译器在这方面完全忽略了它,现在它的唯一目的是提供内部链接。

关于c++ - header 中定义的函数是否保证内联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2391294/

相关文章:

javascript - 如何在 V8 中获取脚本的原始文件名

c++ - 如何为类成员变量定义threadprivate变量

haskell - IO 操作中纯表达式的重复求值

c++ - 我是否必须在函数实现中重复内联关键字

.net - 将 MethodImplOptions.AggressiveInlining 应用于 F# 函数

c++ - 在派生类中声明的虚函数

C++ No appropriate default constructor available C2152 ,但我没有指定任何构造函数?

c++ - 列表迭代器不兼容断言失败

c++ - Web 服务器端应用程序的 NTLM 身份验证

C:将预编译代码编译为内联