我观察到在简单的 C++ 程序中使用
malloc
与使用 new
时总内存分配存在差异,如 Valgrind 报告的那样。下面是我的程序的两个版本以及相应的 Valgrind 输出。
使用
malloc
的版本:
#include <cstdlib>
int main() {
int* a = (int *)malloc(4);
return 0;
}
Valgrind 输出为
malloc
:
==34673== HEAP SUMMARY:
==34673== in use at exit: 4 bytes in 1 blocks
==34673== total heap usage: 1 allocs, 0 frees, 4 bytes allocated
使用
new
的版本:
int main() {
int* a = new int;
return 0;
}
Valgrind 输出为
new
:
==35295== HEAP SUMMARY:
==35295== in use at exit: 4 bytes in 1 blocks
==35295== total heap usage: 2 allocs, 1 frees, 72,708 bytes allocated
我很困惑为什么这两种情况报告的“总堆使用量”有如此显着的差异。具体来说,为什么
new
版本报告的分配字节数比 malloc
版本多得多?这是否与 C++ 使用 new
时内部处理内存管理的方式有关?
此外,即使我只使用这段代码,也会有 72,704B 的开销:
#include <iostream>
int main() {
return 0;
}
这个开销似乎与动态内存管理有关,但我不明白为什么它如此重要。
g++ --version
g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
valgrind --version
valgrind-3.18.1
我用来构建
g++ program_name.cpp
然后 valgrind ./a.out
的命令
首先,malloc是一个简单的C函数,它分配指定大小的内存块并返回指向它的指针。因此,malloc 的开销是最小的,并且直接对应于所请求的内存。
但是,当你使用new时,new是一个运算符,而不仅仅是一个函数。与malloc相比,它有更多的职责。 因为它不仅分配内存,而且还调用对象的构造函数。因此 new 的实际内存分配可能不仅仅涉及为 int 请求的 4 个字节。