同じコードを使用する場合、コンパイラーを(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 ++機能を繰り返し無効にして、メモリフットプリントにどのような影響があるかを確認します。
clang++ -xc
ではなくでコンパイルするとclang
、同じ割り当てがありました。これは、リンクされたライブラリによるものであることを強く示唆しています
C
modeでまったく同じバイト数とまったく同じバイト数モードを生成することは疑わしいと思いC++
ます。文字起こしミスをしましたか?