我需要.cpp文件吗?只使用标题,并使所有内容内联
Do I need .CPP files at all? Use headers only and make everything inline?
GCC 4.6.1,特别是
我知道CPP文件用于将接口与实现分离;我现在不感兴趣。
看到这里,我找不到任何理由不使用头文件和所有内联函数。
性能是一个问题,但我不认为这种方法会使事情变慢。我不想要的是,通常内联的临界区会变得很慢,因为所有都是内联的。
主要问题是编译时间。
如果所有内容都包含在单个"主"编译单元中,那么如果更改单个文件中的单个字符,则必须重新编译所有内容。
另一方面,与使用多个编译单元(在这种情况下,必须多次编译相同的头文件,并且链接器将有更多的工作要做)相比,完整的重新编译将非常可能快。使用单个编译单元,每个头文件只需要处理一次,并且链接器的工作非常简单)对于多个.cpp文件,您可以在其中一个文件中进行更改,并且只需要重新编译文件。
但是一些流行的库是头文件。这绝对是可行的。
性能方面,它应该相同或更快。你让编译器对你的整个代码完全可见,这意味着它可以很容易地优化函数调用,并内联任何它喜欢的东西。
注意,你从来没有强迫编译器内联。inline
关键字(以及其他具有相同效果的技巧)不会告诉编译器"这必须内联"。但是,通过抑制单定义规则(ODR),它们允许您将定义包含到多个编译单元中,因此,如果编译器选择内联, 将变得更容易。
但是这意味着你不需要担心所有的东西都是内联的。编译器只会内联有意义的部分
以下是一些不这样做的理由:
- 没有封装;"内部"方法对整个程序可见。
- 命名空间污染(导致命名冲突或程序员错误)
- 依赖问题;要确保每件事都按照正确的顺序声明就变得更加困难了。
- 增加编译时间
撇开性能和内联不谈,有些事情您不能仅使用头文件来完成,例如类的static
字段。
也就是说,STL
的大多数(如果不是全部)都是头文件,Boost
的大多数也是。
至于内联方法/函数——这并不重要。编译器比您更清楚该做什么,可能会忽略inline
关键字(使函数非内联),或者相反,即使函数没有声明为内联,也会使函数调用内联。
如果所有的函数都是"inline"的,那么你的二进制文件就会变大,这可能会导致性能下降。你应该只内联非常小的和经常被调用的函数。
相关文章:
- Inline STD :: MUTEX在标题文件中
- 由于QT MOC,将标题包括在标题文件中
- C 在标题文件中创建具有结构定义的结构的队列
- 似乎无法将我的标题文件与我的CPP文件连接到链接列表中
- 标题文件如何参考源文件C
- 如何将用户下载的标头文件添加到系统中默认情况下的标题文件列表
- C 在两个标题文件中包括一个类
- 默认的车身或标题文件中的C 定义
- 向前删除标题文件中其他名称空间的自定义类型
- C 在多个源文件中包含具有同一类实现的不同标题文件
- C 11在标题文件中未识别
- 如何使用多个测试.cpps在标题文件中使用instantiate_test_case_p
- 标题文件中大规模转发声明类别的风险是什么?
- 对于为什么放置在标题文件中很重要的原因感到困惑
- 无法包装标题文件中定义的简单类
- 如何在标题文件中获取成员功能的正确代码覆盖范围
- 如何将标题文件放在野牛中的.tab.h
- 预处理器指令:为什么使用#Define的标题文件标识符与标头文件名不同
- CMAKE QT创建者:将标题文件添加到项目文件中
- 在标题文件和CPP文件中都包含库