将代码存储在头文件中会导致 C++ 中的内存管理问题吗?

Does storing code in header files cause memory management issues in C++?

不久前,一位男士告诉我,将所有代码存储在 .h 文件中会产生一些内存管理问题。因为我有太多重复的 class。如果我将代码存储在 .h/.cpp 文件中,我将避免这个问题。真的吗?

我已经在谷歌上搜索了一些关于这个主题的信息,我读到这一切都与习惯有关。那么如果将所有代码存储在.h文件中,内存问题怎么办?

... one man told me that storing all the code in .h files produces some memory management issues. [...] And I'll avoid this issue if I'll store a code in .h/.cpp files. Is that true?

内存管理通常是指在运行时处理动态内存。为清楚起见:在 headers 中编写所有代码与此无关。但是,这样做可能会增加编译器实际使用的内存量。所以,如果这就是 一个人 的意思,那么是的,它可能 可能 是真的——但这不是该方法的最大问题。

Because I get too many duplicates of one class

这是一个愚蠢的论点。事实上,仅使用 header 个文件作为定义意味着只有一个翻译单元,其中 class 定义只包含一次。

潜在的问题是您的单个翻译单元包含所有 header 文件中的所有定义。由于一切都是一次性处理的,因此编译器所需的最大内存可能更高。这对大多数项目来说可能无关紧要,但对于像 libreoffice 这样的东西,它可能会成为一个问题。


在 header 中定义所有函数的一个更大的问题——即使用单个翻译单元——是对任何 header 的任何更改,无论多么小,都会导致单个庞大的翻译单元更改,您将需要重新编译它。对于多个 更小 的翻译单元,只有受更改影响的翻译单元才需要重新编译。

所以,你的方法的问题是每次重新编译都和从头开始编译一样慢。当然,如果编译需要一分钟,那没关系,但对于需要数小时从头开始编译的项目,这是必不可少的。

你的"one man"不知道他在说什么。

头文件的使用只能(可能)导致编译器(或实现编译阶段的程序)在编译期间消耗更多内存。不过,这取决于编译器的实现方式。一个高质量的编译器会处理它。如果某些编译单元有足够的代码导致编译器 运行 内存不足,那么这是另一个问题......并且在很大程度上与头文件的使用无关。

如果您编写的代码会导致程序中出现内存管理问题,那么将该代码放入头文件中没有任何区别 - 糟糕的代码会导致程序出现内存管理问题(泄漏、使用悬挂指针等),无论该代码的某些部分是否在头文件中。

如果不小心使用头文件,在某些情况下,多个目标文件可能每个都包含一些函数的定义。从技术上讲,这会增加程序的内存使用量,但也有一些编码技术可以减轻这种情况——尽管如果使用头文件,这些技术的一些细节可能会略有不同。换句话说,是编写糟糕的代码才有所作为,而不是(单独)将代码放入头文件中。

头文件(或更普遍的预处理器)的使用还有其他问题。但是使用头文件和管理此类问题的技术是有好处的。而且这些问题实际上与内存管理问题无关。

实际上,在头文件和编译单元(也称为 .h 和 .cpp 文件)之间明智地拆分代码通常会更好。但也有一些情况下,将库的函数定义放在头文件中是有益的(例如模板库)。