【问题标题】:Why Bother With the 'inline' Keyword in C++?为什么要在 C++ 中使用“内联”关键字?
【发布时间】:2013-06-26 16:45:34
【问题描述】:

我刚刚在 Microsoft Website 上研究了 C++ 关键字 inline 的用法和好处/缺陷,我了解所有这些。

我的问题是:如果编译器评估函数以查看内联它们是否会导致代码更高效,而 inline 关键字只是对编译器的一个建议,那么为什么还要使用关键字呢?

编辑:很多人都在抱怨我使用__inline 而不是inline。我想指出,__inline 是微软特有的:所以没有错,只是不一定是你习惯的。(同时修复了网站链接)

EDIT2:重新格式化问题以指示 inline 关键字(用于所有 C++)而不是 Microsoft 特定的 __inline 关键字。

【问题讨论】:

  • 标题不应该是“为什么要在 Visual Studio 中使用 __inline 关键字”?
  • @Edward:他们在呻吟,因为你写了Why bother with the __inline keyword in C++?;他们不会让你写 Why bother with the __inline keyword in VC++,即 C++ 语言标准的 Microsoft 编译器实现,而不是 C++ 语言标准本身。

标签: c++ inline compiler-optimization


【解决方案1】:

首先,不是__inline,而是inline

其次,不可否认,inline 在单一定义规则中的影响是显着的。它允许您多次定义函数并让编译器来处理它。

第三,关于实际的 inilining,这是您向编译器以及以后可能阅读您的代码的人表达您对该函数的意见的方式。在许多情况下,这是一种发泄情绪的方式,可以这么说。基本上,这是你告诉别人和你自己的一种方式:“我觉得这个函数太小(或太专业),无法证明调用开销是合理的,所以不要让我为这种讽刺负责。我做了所有我可以。如果不是因为你愚蠢的公司范围内的编码标准,我会把它变成一个宏”。在这方面,它是一种正式的评论

第四,看到您使用了特定于实现的关键字拼写,我注意到一些实现为您提供了替代关键字,让您有机会变得更……呃……有说服力 em> 在您希望内联该功能的情况下。在 MS 编译器中,这将是 __forceinline

【讨论】:

  • 我知道__forceinline 关键字(因此我没有提到它,而是专门谈论inline 关键字),我个人的偏好是将所有函数定义放在.cpp 文件,而不是在 .h 中塞进一些,所以它看起来更整洁。但是感谢您为我解释要点(我知道其他人有不同的偏好)。
  • @Edward 您无法从头文件中获取所有函数定义。对于模板,函数定义必须在模板被实例化的时候可用。同样,如果您想让编译器通过内联函数调用来优化函数调用,则函数定义必须可用于调用这些函数的每个编译单元。
【解决方案2】:

关键字是inline,而不是__inline

inline 不仅仅是一个建议,它是在不违反单一定义规则的情况下在头文件中包含函数定义的最佳标准兼容方式。

【讨论】:

    【解决方案3】:

    MSDN中的文档来看,我认为这是一个纯粹实用的事情,主要是为了C程序的利益。

    由于inline 在 C 中是有效的标识符名称,因此在 C 中需要另一个关键字。

    就我个人而言,如果我的源代码最终可以在 C 和 C++ 程序之间共享(显然是在 Visual Studio 中),我只会考虑使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      • 2019-12-07
      相关资源
      最近更新 更多