如果我在 header 中定义非成员函数,编译器将始终内联它,还是编译器根据其启发式选择?我知道__inline只是一个提示,它与 header 中的函数一样吗?

最佳答案

请记住,包含 header 中的内容与直接在源文件中键入内容没有什么不同。因此,就编译器而言,放在头文件中没有任何区别。它从来不知道它在那里。

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

答案是“取决于编译器”。该标准不保证内联或不内联。话虽如此,任何现代的编译器对其内联的内容都将非常聪明,这可能与启发式方法有关。

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

顺便说一句,__inline是非标准的。与您的文章相反,它通常是编译器扩展,用于强制内联而不是暗示内联。 inline是标准关键字,最初旨在暗示内联。就像您说的那样,大多数现代编译器在这方面完全忽略了它,如今的唯一目的是使事物具有内部联系。

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

10-11 22:59
查看更多