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

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

本文关键字:内存 管理 问题 c++ 文件 存储 代码      更新时间:2023-10-16

不久前,一个人告诉我,将所有代码存储在.h文件中会产生一些内存管理问题。因为一门课有太多的副本。如果我将代码存储在。h/.cpp文件中,我将避免这个问题。这是真的吗?

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

…有人告诉我,将所有代码存储在.h文件中会产生一些内存管理问题。[…如果我将代码存储在.h/.cpp文件中,我将避免这个问题。这是真的吗?

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

因为我有太多重复的类

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

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


在头文件中定义所有函数(即使用单个翻译单元)的一个更大的问题是,对任何头文件的任何更改,无论多么小,都会导致单个大规模的翻译单元发生变化,并且您将需要重新编译它。对于多个较小的翻译单元,只有受更改影响的单元需要重新编译。

所以,这种方法的问题在于每次重新编译都和从头编译一样慢。当然,如果编译需要花费一分钟,这并不重要,但是对于需要花费数小时从头编译的项目来说,这是必不可少的。

你的"一个人"不知道他在说什么。

使用头文件只能(潜在地)导致编译器(或实现编译阶段的程序)在编译期间消耗更多内存。这取决于编译器是如何实现的。一个高质量的编译器会处理它。如果一些编译单元有足够的代码导致编译器耗尽内存,那么这是另一个问题....而且基本上与头文件的使用无关。

如果你写的代码在你的程序中引起内存管理问题,把这些代码放在头文件中没有什么区别——糟糕的代码会导致程序有内存管理问题(泄漏,使用悬空指针等),而不管这些代码的部分是否在头文件中。

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

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

实际上,通常最好在头文件和编译单元(也就是.h和.cpp文件)之间合理地分割代码。但是在某些情况下,将库的函数定义放在头文件中是有益的(例如模板库)。