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