在使用相同的代码时,仅仅改变编译器(从 C 编译器到 C++ 编译器),将会改变内存分配的数量。我不太确定为什么会这样,希望更好地理解它。到目前为止,我得到的最好的回复是 "可能是 I/O 流",这并不是很详细,让我想起了 C++ 的“你所不用,即你所不付”的方面。
我正在使用 Clang 和 GCC 编译器,版本分别为 7.0.1-8 和 8.3.0-6。我的系统运行在 Debian 10(Buster)上,是最新版本。测试基于 Valgrind Massif 进行。
#include <stdio.h>
int main() {
printf("Hello, world!\n");
return 0;
}
这里使用的代码没有改变,但是编译成C语言或C++语言会影响Valgrind基准测试的结果。然而,这些值在不同编译器下保持一致。程序的运行时内存分配情况(峰值)如下:
- GCC (C): 1,032字节(1 KB)
- G++ (C++): 73,744字节(~74 KB)
- Clang (C): 1,032字节(1 KB)
- Clang++ (C++): 73,744字节(~74 KB)
编译命令如下:
clang -O3 -o c-clang ./main.c
gcc -O3 -o c-gcc ./main.c
clang++ -O3 -o cpp-clang ./main.cpp
g++ -O3 -o cpp-gcc ./main.cpp
对于Valgrind,我在每个编译器和语言上运行valgrind --tool=massif --massif-out-file=m_compiler_lang ./compiler-lang
,然后使用ms_print
来显示峰值。这样做有问题吗?
try
块时不会有性能损失,但会增加内存占用,可能采用跳转表等方式实现。你可以尝试编译时禁用异常,看看对程序的影响如何。另外,你也可以逐步禁用其他C++特性,观察它们对内存占用的影响。 - François Andrieuxclang++ -xc
编译而不是clang
时,出现了相同的分配情况,这强烈暗示其原因是由于链接的库。 - Justin