c++ - 什么时候应该为函数/方法写入关键字 'inline'?

标签 c++ inline one-definition-rule

我什么时候应该为 C++ 中的函数/方法编写关键字 inline

看了一些回答,一些相关的问题:

  • 我什么时候应该为 C++ 中的函数/方法编写关键字“inline”?

  • 编译器什么时候不知道什么时候使函数/方法“内联”?

  • 如果应用程序是多线程,当一个人为函数/方法编写“内联”时,这有关系吗?

最佳答案

哦,伙计,我最讨厌的人之一。

inline 更像是 staticextern 而不是告诉编译器内联您的函数的指令。 externstaticinline 是链接指令,几乎专门由链接器使用,而不是编译器。

据说 inline 向编译器提示您认为该函数应该内联。这在 1998 年可能是正确的,但十年后编译器不需要这样的提示。更不用说人类在优化代码时通常是错误的,因此大多数编译器会完全忽略“提示”。

  • static - 变量/函数名称不能在其他翻译单元中使用。链接器需要确保它不会意外使用来自另一个翻译单元的静态定义变量/函数。

  • extern - 在此翻译单元中使用此变量/函数名称,但如果未定义则不要提示。链接器会将其整理出来并确保所有尝试使用某些外部符号的代码都有其地址。

  • inline - 这个函数会在多个翻译单元中定义,不用担心。链接器需要确保所有翻译单元都使用变量/函数的单个实例。

注意:通常,声明模板inline 是没有意义的,因为它们已经具有inline 的链接语义。但是,模板的显式特化和实例化 require inline被使用。


具体回答您的问题:

  • When should I write the keyword 'inline' for a function/method in C++?

    仅当您希望在标题中定义函数时。更确切地说,只有当函数的定义可以出现在多个翻译单元中时。在头文件中定义小的(如在一个衬里中)函数是个好主意,因为它为编译器提供了更多信息,以便在优化代码时使用。它还会增加编译时间。

  • When should I not write the keyword 'inline' for a function/method in C++?

    不要仅仅因为您认为如果编译器内联代码会运行得更快就添加内联。

  • When will the compiler not know when to make a function/method 'inline'?

    通常,编译器能够比您做得更好。但是,如果编译器没有函数定义,则它没有内联代码的选项。在最大限度优化的代码中,无论您是否要求,通常所有的 private 方法都是内联的。

    除了在 GCC 中防止内联外,使用 __attribute__(( noinline )),在 Visual Studio 中,使用 __declspec(noinline)

  • Does it matter if an application is multithreaded when one writes 'inline' for a function/method?

    多线程不会以任何方式影响内联。

关于c++ - 什么时候应该为函数/方法写入关键字 'inline'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50494839/

相关文章:

c++ - 强制初始化模板类的静态数据成员

c++ - 如何编写返回仅存在于类中的类型的成员函数?

c++ - 内联函数联动变化

variables - Jade : express/node variables/objects in jade inline javascript?

css - 当绝对位置元素的包含 block 为行内元素时

c++ - 为什么 C++ 链接器对 ODR 违规保持沉默?

c++ - 全局变量0-初始化惩罚

c++ - 如何从 Windows LPBITMAP 或 HBITMAP 获取实际的字节数组?

c++ - matlab C 共享库 : capturing matlab function output with mxArray*/mxArray**

c++ - 类 vtable 如何跨共享库工作?