1. ホーム
  2. c++

[解決済み] C++の初期配置はなぜCより大きいのですか?

2022-05-31 11:55:49

疑問点

同じコードで、コンパイラを変える(CコンパイラからC++コンパイラへ)だけで、メモリの確保量が変わってきます。これがなぜなのかよくわからないので、もっと理解したいと思っています。これまでのところ、私が得た最も良い回答は「おそらく I/O ストリーム」ですが、これはあまり説明的ではなく、C++ の「使わないものにはお金を払わない」という側面について疑問を抱かせます。

私は Clang と GCC コンパイラーを使用しており、それぞれバージョン 7.0.1-8 と 8.3.0-6 です。私のシステムは Debian 10 (Buster), latest で動作しています。ベンチマークは 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 でピークを表示します。

私はここで何か間違ったことをしているのでしょうか?

どのように解決するのですか?

ヒープの使用は、C++標準ライブラリに由来します。起動時に内部ライブラリ用のメモリを確保するのです。それに対してリンクしなければ、CとC++の差はゼロになるはずです。GCCやClangを使えば、コンパイルすることができます。

g++ -Wl,--as-need(必要に応じて) main.cpp

これは、リンカーに未使用のライブラリに対してリンクしないように指示します。この例のコードでは、C++ライブラリは使用されていませんので、C++標準ライブラリに対してリンクしないようにします。

また、C ファイルでこれをテストすることもできます。でコンパイルした場合。

gcc main.c -lstdc++ とします。

Cプログラムをビルドしたのに、ヒープ使用量が再表示されます。

ヒープの使用は、明らかに使用している特定の C++ ライブラリ実装に依存します。あなたの場合、それは GNU C++ ライブラリです。 libstdc++ . 他の実装では、同じ量のメモリを割り当てないかもしれませんし、まったくメモリを割り当てないかもしれません (少なくとも起動時には) LLVM C++ ライブラリ ( libc++ ) などは、少なくとも私の Linux マシンでは、起動時にヒープを割り当てません。

clang++ -stdlib=libc++ main.cpp

ヒープ使用は、それに対して全くリンクしないのと同じです。

(コンパイルに失敗する場合、libc++がインストールされていない可能性があります。パッケージ名は通常 "libc++" または "libcxx" を含んでいます)。