1

次の定義があるとします。

 class C{};

どのくらいのスペースが割り当てられますか? この段階で作成されたメソッドは何ですか? インスタンス化までスペースが割り当てられないと思ったのですが、これは部分的にしか当てはまらないと思います。編集: コンパイラの sizeof(C) をチェックインしましたが、クラスのオブジェクトを作成していませんが、1 バイトです。

このリンクを試してください http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=319

4

3 に答える 3

4

ほとんどの場合、サイズは です1が、クラスのインスタンスを作成する場合のみです。オブジェクトのサイズを にすることはできません0。インスタンスを作成しない場合、追加されるスペースはデフォルトのメンバー関数によって使用されるスペースのみであり、最適化する必要があります。

コンパイラによって生成された既定のコンストラクター、コピー コンストラクター、移動コンストラクター、デストラクタ、代入演算子、および移動代入演算子は、何もしませんが、生成されます。

于 2012-06-25T16:52:43.190 に答える
1

C++ 標準で保証されている唯一のことは、サイズが非ゼロになることです。

これは、正確なサイズがどうなるかについて定義された実装です。実装のほとんどは1、空のクラスのサイズを持ちます。

デフォルトのメンバー関数は、それらの関数を必要とするコードがある場合にのみ合成されることに注意してください。また、これらの関数によってクラス インスタンスのサイズが増加することはありません。オブジェクトごとに割り当てられるわけではありません。

Bjarne 自身の言葉によると、よく読んでください:
なぜ空のクラスのサイズはゼロではないのですか?

于 2012-06-25T16:54:43.783 に答える
0

(以下の回答は GCC 4.4 で検証済みです。)

あなたのような単純で非ポリモーフィックな型の単なる定義はC、実行可能ファイルを大きくすることも、スタック (またはヒープ、またはその他の場所) 上のスペースも必要としません。コンパイル時にコンパイラのシンボルテーブルを一時的に拡大し、コンパイラにこれを行うように依頼した場合はデバッグシンボルを出力する可能性がありますが、これがあなたの質問の主旨ではないと思います。それ以外の場合、Cタイプの実際のオブジェクトCがインスタンス化されるまでスペースを取りません。

C your_c;
C my_c;

一意にアドレス指定できるように、型の各オブジェクトはC未使用の 1 バイトを占有します。

さて、完成させるために、隠れた中間の問題があります。ツールチェーンは、事前リンクされたオブジェクト ファイル (名前が ".o" または ".obj" で終わるファイル) の一部として、未使用の型のシンボルを出力する場合と出力しない場合があります。私のコンパイラはそうではありませんが(試してみました)、あなたのコンパイラはそうかもしれません。

これらすべてが技術的すぎると思われる場合、答えの公正な概算または要約は次のとおりです。コードはスペースを取りません。

于 2012-06-25T17:03:01.230 に答える