这不是一个"我有这个问题"的问题,而更多的是"我真的想了解语言如何更好地工作"的问题。
我最近开始在一个给定类的.cpp文件中遇到内联功能的定义。我想了解内联功能的定义点之间的实际区别。在对CPP中定义的内联进行对象级分析时,C++中声明的内联(而不是在.h中定义的)似乎有更高的百分比被优化为映射函数,而不是合法内联-这是主要区别吗,或者这背后有没有其他我看不到的目的。
没有区别。inline
是编译器的一个提示,但现在并不特别重要,因为编译器非常擅长在没有您帮助的情况下确定是否内联扩展函数(请参阅register
关键字)。
inline
还告诉编译器,不同翻译单元中的多个定义是可以的(前提是它们相同),这是在头文件中放入内联函数时所需要的。
当内联函数在.cpp文件中定义时,其定义仅在该文件中可见,因此从其他源文件调用它将不起作用。
inline
函数如果没有每个翻译单元只有一个定义,就没有意义,因此将其放在头文件中是有意义的,在那里可以重用定义。当一个inline
函数只在一个源文件中使用时,在本地定义它是有意义的。这都是上下文的问题。
这种差异很可能是编译器没有进行"链接时间"/"整个程序"优化的结果。这是指编译器在查看整个程序而不是单个翻译单元时执行优化。即使在支持它的编译器中,它通常也不会默认打开,因为它通常涉及非常高的内存使用率。
如果仅在翻译单元级别上进行优化,则不可能内联其他源文件中定义的函数,因为该定义不可用。
如果内联函数是在调用之前而不是之后定义的,那么编译器更容易内联它。由于头文件通常包含在源的顶部,因此更容易满足此条件。
从技术上讲,没有差异。
虽然我对它们的优化不太了解,但想想看…
Preprocessor将首先展开.h文件,在.cpp文件中找到#include
。然后它将被呈现给编译器。所以从技术上讲根本没有区别。
但是,有一条规则:
inline
函数必须在调用它的每个编译单元中定义。(当然,必须遵守ODR)。
这是因为,每个编译单元都由编译器程序的一个单独实例处理。
因此,通常,内联函数是在头文件中定义的,该头文件包含在每个对该函数进行调用的.cpp文件中。