出于某种原因,当您将模板类(即声明为 template <typename T> class Thing
的类)拆分为 .h
时,C++ 似乎不喜欢它。和一个 .cpp
文件,就像处理任何其他类一样。
那是不是写模板类的时候就直接写在头文件里就可以了? C++ 程序员在这些情况下会做什么?
编辑:我知道除了将其全部写入 .h
之外还有其他选择。文件。但最好的选择是什么?或者最常见的选项是什么?
最佳答案
将模板的定义拆分到另一个文件中很流行。它是如此受欢迎,甚至可能是最常见的做法,但我对此并不乐观。
我认为这是不好的做法(与将定义放在同一个标头中相反),原因如下。
我在编写代码时的优先事项是(最重要的):
- 正确性。
- 运行时性能。
- 编译时性能。
- 可维护性/易于阅读。
- 易于编写。
只要模板定义在同一 header 中,或者在 header 包含的另一个文件中,第一优先级正确性就不会受到任何影响。
第二优先级的运行时性能不会受到丝毫影响。
第三优先级 编译时性能 将定义放在单独的文件中会受到负面影响。多少值得商榷。但是,编译器不可能编译 X 数量的代码并打开/关闭两个文件,就像编译完全相同的代码而只打开/关闭一个文件一样快。我的一个 friend 是一位优秀的编译器作者,他曾经告诉我,我能要求他的编译器做的最慢的事情就是打开一个文件。这是在我们进行像今天这样多的编译时计算之前,但仍然...
第四优先级可维护性/易于阅读是相当主观的。但在我看来,单独的文件对这个优先级是有负面影响的。当我阅读代码时,如果所有代码都在一个文件中,通常对我来说更容易理解。当文件的名称或位置不明显时,我不得不去寻找文件时,我真的很生气。当定义被分成许多文件时,我会更加恼火。为了我的钱,一个文件优化了这个优先级。
第五优先级易写也是比较主观的。我认为这两种方式都没有太大优势。将所有内容放在一个文件中会稍微容易一些。但是创建一个新文件当然不难。在这个优先级上,我给“一个文件方法”一个非常小的优势。
所以总而言之,在我的五个优先级中,最重要的两个,这个决定绝对没有影响,并且单独的文件对 3 个较低优先级的负面影响很小。在 3 个较低的优先级中,编译时性能客观上受到负面影响,这是其中最重要的。诚然,两个最低优先级对于它们是否受到正面或负面影响是主观的。
我认为将模板定义放在单独的 header 中没有任何好处,而且成本很小。
关于c++ - 我应该总是在头文件中定义我的整个模板类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26197647/