我需要.cpp文件吗?只使用标题,并使所有内容内联

Do I need .CPP files at all? Use headers only and make everything inline?

本文关键字:标题 文件 cpp      更新时间:2023-10-16

GCC 4.6.1,特别是

我知道CPP文件用于将接口与实现分离;我现在不感兴趣。

看到这里,我找不到任何理由不使用头文件和所有内联函数。

性能是一个问题,但我不认为这种方法会使事情变慢。我不想要的是,通常内联的临界区会变得很慢,因为所有都是内联的。

主要问题是编译时间。

如果所有内容都包含在单个"主"编译单元中,那么如果更改单个文件中的单个字符,则必须重新编译所有内容。

另一方面,与使用多个编译单元(在这种情况下,必须多次编译相同的头文件,并且链接器将有更多的工作要做)相比,完整的重新编译将非常可能。使用单个编译单元,每个头文件只需要处理一次,并且链接器的工作非常简单)

对于多个.cpp文件,您可以在其中一个文件中进行更改,并且只需要重新编译文件。

但是一些流行的库是头文件。这绝对是可行的。

性能方面,它应该相同或更快。你让编译器对你的整个代码完全可见,这意味着它可以很容易地优化函数调用,并内联任何它喜欢的东西。

注意,你从来没有强迫编译器内联。inline关键字(以及其他具有相同效果的技巧)不会告诉编译器"这必须内联"。但是,通过抑制单定义规则(ODR),它们允许您将定义包含到多个编译单元中,因此,如果编译器选择内联将变得更容易。

但是这意味着你不需要担心所有的东西都是内联的。编译器只会内联有意义的部分

以下是一些不这样做的理由:

  • 没有封装;"内部"方法对整个程序可见。
  • 命名空间污染(导致命名冲突或程序员错误)
  • 依赖问题;要确保每件事都按照正确的顺序声明就变得更加困难了。
  • 增加编译时间

撇开性能和内联不谈,有些事情您不能仅使用头文件来完成,例如类的static字段。

也就是说,STL的大多数(如果不是全部)都是头文件,Boost的大多数也是。

至于内联方法/函数——这并不重要。编译器比您更清楚该做什么,可能会忽略inline关键字(使函数非内联),或者相反,即使函数没有声明为内联,也会使函数调用内联。

如果所有的函数都是"inline"的,那么你的二进制文件就会变大,这可能会导致性能下降。你应该只内联非常小的和经常被调用的函数。