当使用相同的代码时,只需更改编译器(从C编译器到C ++编译器)将更改分配的内存量。我不太确定为什么会这样,并且想进一步了解它。到目前为止,我得到的最好的答复是“可能是I / O流”,它不是很具描述性,使我想知道C ++的“您不用为不使用的东西付钱”。
我正在使用分别为7.0.1-8和8.3.0-6的Clang和GCC编译器。我的系统在最新的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)
- lang(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 ++功能,以查看对内存占用量有何影响。
clang++ -xc
而不是进行编译时clang
,存在相同的分配,这强烈表明其归因于链接库
C
模式下生成的字节数完全相同,在模式下生成的字节数完全相同,这令人怀疑C++
。你有抄写错误吗?