【发布时间】:2019-11-03 15:16:45
【问题描述】:
使用相同的代码时,只需更改编译器(从 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 以显示峰值。
我在这里做错了吗?
【问题讨论】:
-
首先,您如何构建?你使用什么选项?你如何衡量?你是如何运行 Valgrind 的?
-
如果我没记错的话,现代 C++ 编译器必须有一个异常模型,其中进入
try块不会影响性能,但会以更大的内存占用为代价,可能使用跳转表或其他东西.也许尝试无例外地编译,看看有什么影响。编辑:事实上,反复尝试禁用各种 c++ 功能,看看对内存占用有什么影响。 -
使用
clang++ -xc而不是clang编译时,存在相同的分配,这强烈表明它是由于链接库所致 -
@bigwillydos 这确实是 C++,我看不出它破坏了 C++ 规范的任何部分......除了可能包括 stdio.h 而不是 cstdio 但至少在旧 C++ 版本中是允许的.您认为这个程序中的“畸形”是什么?
-
我觉得可疑的是,那些 gcc 和 clang 编译器在
C模式下生成完全相同的字节数和在C++模式下生成完全相同的字节数。您是否犯了转录错误?
标签: c++ c benchmarking