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

C++ - What is the difference between inlines defined in CPP and H

本文关键字:之间 什么 区别 定义 C++-CPP      更新时间:2023-10-16

这不是一个"我有这个问题"的问题,而更多的是"我真的想了解语言如何更好地工作"的问题。

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

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

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

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

inline函数如果没有每个翻译单元只有一个定义,就没有意义,因此将其放在头文件中是有意义的,在那里可以重用定义。当一个inline函数只在一个源文件中使用时,在本地定义它是有意义的。这都是上下文的问题。

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

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

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

从技术上讲,没有差异。

虽然我对它们的优化不太了解,但想想看…

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

但是,有一条规则:

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

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

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