【发布时间】:2015-11-09 22:01:24
【问题描述】:
在When should I write the keyword 'inline' for a function/method? 上阅读old answer,上面写着:
据说内联提示编译器你认为函数应该被内联。这在 1998 年可能是正确的,但十年后编译器不需要这样的提示。更不用说在优化代码时人类通常是错误的,所以大多数编译器完全忽略了“提示”。
这个答案是在 2009 年发布的,所以我想最终弄清楚:
- 现代 c++11 兼容编译器是否总是忽略用户指定的
inline提示并且仅自动执行此操作? -
inline提示是否只保留以提供向后兼容性? - 如果不是
1.那么这个答案不正确?
【问题讨论】:
-
@iammilind 所以,回答你的问题表明
clang不要忽略使current answer 错误的提示,因为现在至少clang仍在搜索inline关键字并做出一些决定。 -
是的。具有讽刺意味的是,与 2014 年 11 月给出的答案相比,2009 年 11 月给出的答案更现代。我希望前者是真的,这是我问这个问题时的确切假设。很有可能,2014 年 11 月给出的答案可能是 Clang 限制的一个孤立场景。无论如何,我将通过列出possible duplicate 来标记重新打开这个问题。
-
一些编译器让你选择。例如,MSVC 有以下选项:根本不内联任何东西,内联只是标记为
inline的函数,或内联显然应该是的任何东西(无论它是否标记为inline)。 -
您误解了您链接到的答案,或者没有完全阅读。答案并没有说
inline只是一个被忽略的提示,它说inline改变了语言语义,以便可以在多个翻译单元中定义一个函数。这不仅是为了向后兼容而保留的,它还是 C++ 语言和链接模型的一个重要属性。所以你的整个问题似乎是基于一个有缺陷的前提。inline不仅仅是“提示”,它改变了代码的编译+链接方式,使得编译器可以进行内联(没有 LTO)。 -
@jonathan
namespace{也允许这种情况在没有 LTO 的情况下发生,并且不太可能导致 ODR 违规。 (现在,staticlocals 在您想要内联的非 LTO 函数中,那么您仍然需要它!)