[解決済み] C++の初期配置はなぜCより大きいのですか?
疑問点
同じコードで、コンパイラを変える(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" を含んでいます)。
関連
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み] なぜJavaでは2 * (i * i)の方が2 * i * iより速いのですか?
-
[解決済み】C++はC#よりどのくらい速いのか?
-
[解決済み】RedisはmongoDBよりどれくらい速いのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)