何时应该inline在 C++ 中为函数/方法编写关键字?
inline
看到一些答案后,一些相关的问题:
什么时候不 应该为 C++ 中的函数/方法编写关键字“内联”?
编译器何时不知道何时将函数/方法“内联”?
当为函数/方法编写“内联”时,应用程序是否是 多线程 的是否重要?
哦,伙计,我最讨厌的事情之一。
inline更像static或extern比一个指令告诉编译器内联你的函数。 extern, static,inline是链接指令,几乎只由链接器使用,而不是编译器。
static
extern
据说inline向编译器提示您认为该函数应该被内联。这在 1998 年可能是正确的,但十年后编译器不需要这样的提示。更不用说在优化代码时人类通常是错误的,所以大多数编译器都完全忽略了“提示”。
static - 变量/函数名称不能在其他翻译单元中使用。链接器需要确保它不会意外使用来自另一个翻译单元的静态定义的变量/函数。
extern - 在此翻译单元中使用此变量/函数名称,但如果未定义,请不要抱怨。链接器将对其进行排序,并确保所有尝试使用外部符号的代码都有其地址。
inline - 这个函数会在多个翻译单元中定义,不用担心。链接器需要确保所有翻译单元都使用变量/函数的单个实例。
注意: 通常,声明模板inline是没有意义的,因为它们已经具有链接语义inline。但是,需要inline)使用模板的显式特化和实例化。
您的问题的具体答案:
我什么时候应该为 C++ 中的函数/方法编写关键字“内联”?
仅当您希望在标题中定义函数时。更准确地说,只有当函数的定义可以出现在多个翻译单元中时。在头文件中定义小(如在一个衬里)函数是一个好主意,因为它在优化代码时为编译器提供了更多信息。它还增加了编译时间。
什么时候不应该为 C++ 中的函数/方法编写关键字“内联”?
不要仅仅因为您认为如果编译器内联您的代码会运行得更快,就添加内联。
一般来说,编译器会比你做得更好。但是,如果没有函数定义,编译器就没有内联代码的选项。在最大限度优化的代码private中,无论您是否要求,通常所有方法都内联。
private
为了防止在 GCC 中内联,请使用__attribute__(( noinline )),而在 Visual Studio 中,请使用__declspec(noinline).
__attribute__(( noinline ))
__declspec(noinline)
当为函数/方法编写“内联”时,应用程序是否是多线程的是否重要?
多线程不会以任何方式影响内联。