在头文件中存储代码会导致c++中的内存管理问题吗?
Does storing code in header files cause memory management issues in C++?
不久前,一个人告诉我,将所有代码存储在.h文件中会产生一些内存管理问题。因为一门课有太多的副本。如果我将代码存储在。h/.cpp文件中,我将避免这个问题。这是真的吗?
我已经在谷歌上搜索了一些关于这个主题的信息,我读到这只是一个习惯。那么,如果将所有代码存储在.h文件中,会出现内存问题吗?
内存管理通常指的是在运行时对动态内存的处理。为了清楚起见:在头文件中编写所有代码与此无关。然而,这样做可能会增加编译器实际使用的内存量。所以,如果这就是一个人的意思,那么是的,它可能潜在地是真的-但这不是该方法最大的问题。…有人告诉我,将所有代码存储在.h文件中会产生一些内存管理问题。[…如果我将代码存储在.h/.cpp文件中,我将避免这个问题。这是真的吗?
这是一个愚蠢的论点。实际上,只使用头文件作为定义意味着只有一个翻译单元,其中类定义只包含一次。因为我有太多重复的类
潜在的问题是,您的单个翻译单元包含所有头文件中的所有定义。由于所有内容都是一次性处理的,因此编译器所需的最大内存可能更高。对于大多数项目来说,这可能无关紧要,但对于像libreoffice这样的项目,这可能会成为一个问题。
在头文件中定义所有函数(即使用单个翻译单元)的一个更大的问题是,对任何头文件的任何更改,无论多么小,都会导致单个大规模的翻译单元发生变化,并且您将需要重新编译它。对于多个较小的翻译单元,只有受更改影响的单元需要重新编译。
所以,这种方法的问题在于每次重新编译都和从头编译一样慢。当然,如果编译需要花费一分钟,这并不重要,但是对于需要花费数小时从头编译的项目来说,这是必不可少的。
你的"一个人"不知道他在说什么。
使用头文件只能(潜在地)导致编译器(或实现编译阶段的程序)在编译期间消耗更多内存。这取决于编译器是如何实现的。一个高质量的编译器会处理它。如果一些编译单元有足够的代码导致编译器耗尽内存,那么这是另一个问题....而且基本上与头文件的使用无关。
如果你写的代码在你的程序中引起内存管理问题,把这些代码放在头文件中没有什么区别——糟糕的代码会导致程序有内存管理问题(泄漏,使用悬空指针等),而不管这些代码的部分是否在头文件中。
如果不小心使用头文件,在某些情况下,多个目标文件可能每个包含一些函数的定义。从技术上讲,这可能会增加程序的内存使用,但也有一些编码技术可以减轻这种情况——尽管如果使用头文件,这些技术的一些细节可能会有所不同。换句话说,是编写糟糕的代码造成了差异,而不是(单独地)将代码放入头文件。
使用头文件(或更一般的预处理器)还有其他问题。但是使用头文件和技术来管理这些问题是有好处的。这些问题实际上与内存管理问题无关。
实际上,通常最好在头文件和编译单元(也就是.h和.cpp文件)之间合理地分割代码。但是在某些情况下,将库的函数定义放在头文件中是有益的(例如模板库)。
- 当vector是tje全局变量时,c++中vector的内存管理
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- C++将字符串传递给 C 库以进行内存管理
- 从函数返回时C++内存管理
- 函数指针和 lambda 的内存管理
- 自定义内存管理器在发布模式下工作正常,但在调试模式下则不然
- C++中的内存管理
- C和C++中的内存管理有什么区别
- 字符 * 未从重载运算符或内存管理问题正确返回
- 如何在源代码中使用执行策略检测 C++17 的扩展内存管理算法的可用性?
- 底层指针和内存管理
- 智能指针,避免使用QNetworkAccessManager时进行手动内存管理
- c++中的内存管理问题
- 使用矢量时的内存管理
- 循环和内存管理中的指针算术C++?
- C++堆栈内存管理问题
- C 内存管理中的课程如何管理 - 研究
- 不可变数据模型的内存管理
- C++ 使用数组初始化时的 STL 向量内存管理
- SFML 纹理内存管理