C ++ - CPP和H中定义的内联之间有什么区别

时间:2012-08-27 18:29:42

标签: c++ inline-functions

这不是一个“我有这个问题”的问题,更多的是“我真的想要理解语言如何更好地运作”的问题。

我最近开始在.cpp文件中遇到给定类的内联功能定义。我想了解内联功能的定义点之间的区别是什么。在对CPP中定义的内联进行对象级别分析时,似乎C ++中声明的内联中的更高百分比(与.h中定义相反)优化为映射函数而不是合法内联 - 是这是主要的区别,还是我完全没有看到其他目的。

5 个答案:

答案 0 :(得分:3)

没有区别。 inline是编译器的一个提示,但是现在并不是特别重要,因为编译器非常擅长在没有你帮助的情况下确定是否内联扩展函数(参见register关键字)。

inline还告诉编译器不同翻译单元中的多个定义是可以的(前提是它们是相同的),这在将内联函数放入头文件时是必需的。

当在.cpp文件中定义内联函数时,其定义仅在该文件中可见,因此从其他源文件调用它将不起作用。

答案 1 :(得分:2)

如果没有每个翻译单元只有一个单一定义

inline函数就没有意义,所以将它放在头文件中是有意义的,其中定义可以重用。当inline函数仅用于一个源文件时,在本地定义它是有意义的。这完全是一个背景问题。

答案 2 :(得分:1)

差异可能是因为您的编译器没有进行“链接时”/“整个程序”优化。这是编译器在查看整个程序而不是单个翻译单元时执行优化的时候。即使在支持它的编译器中,它通常也不会默认打开,因为它通常涉及非常高的内存使用量。

仅在翻译单元级别进行优化时,无法内联其他源文件中定义的函数,因为该定义不可用。

答案 3 :(得分:1)

如果在调用之前而不是之后定义内联函数,则内联函数更容易编译内联。由于头文件通常包含在源代码的顶部,因此更容易满足此条件。

答案 4 :(得分:0)

从技术上讲,没有的区别。

虽然我对它们的优化知之甚少,但请想一想......

预处理器将首先扩展.h文件,它在.cpp文件中找到#include。然后然后它将被呈现给编译器。所以在技术上根本没有区别。

但是,有一条规则:

  

必须在调用它的每个编译单元中定义inline函数。 (当然,必须遵循ODR)。

这是因为,每个编译单元都由编译程序的单独实例处理。

因此,通常,内联函数在头文件中定义,该文件包含在每个.cpp文件中,在该文件中调用该函数。