问题描述
learncpp.com中关于是否在头文件中实现功能的引文:
假设我遵循#3的建议,并且在my_class::f
文件中实现了一些小的方法my_class.h
,但是我将更大的方法保留在my_class.cpp
中。如果在同一项目的两个不同的my_class.h
文件中包含.cpp
,则链接器将看到my_class::f
的两个(相同)定义。 (这不是由标题保护程序解决的。)我知道有些链接器足够聪明,可以忍受这一点(尽管我听说它会花费额外的时间)。我的问题是:
您认为他们建议#3是因为在一个项目中两次包含相同的.h文件并不常见,还是因为可以依靠链接程序来忽略重复的定义,并且这样做不会浪费太多时间?
解决方法
建议3中有文字
私有成员函数(琐碎的构造函数或析构函数,访问 函数等)。可以在类内部定义。
在类中定义的成员函数是内联函数。因此,将头文件包含在多个编译单元中是没有问题的。
,我了解某些链接器足够聪明,可以忍受这一点
所有符合标准的链接器都可以接受内联函数的多个相同定义。
可以依靠链接器来忽略重复的定义
是的
会不会浪费太多时间?
我希望链接器所浪费的时间不会很长。
但是,通常必须针对使用它们的每个翻译单元来编译内联函数。如果它是一个特别复杂的函数,那么编译器(而不是链接器)可能会浪费大量时间。这就是本教程建议仅内联定义琐碎函数的部分原因。
遵循(暗示的)建议(内嵌定义非平凡函数)的另一个原因是非平凡函数会吸引更改,并且对头文件的修改会随着对包含以下内容的文件的更改而传播:这些标题。非内联函数可以将重新编译时间减少到整个编译时间的一小部分,这是因为不需要重复编译,并且在更改时也不会导致其他翻译单元被编译。