問題タブ [empty-class]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
613 参照

c++ - 完全に空のクラスについて

その出力は次のとおりです。

0 0 0

0xbff36ad0 0xbff36ac8

要素数: 4

結果はとても驚くべきものです。

上記のように、Empty はクラスであり、そのサイズとそのオブジェクトはすべて 0 です。なぜですか?

たぶん、空のクラスのサイズは 1 であり、クラスが空でない場合、そのサイズはメンバーによって決定されるためだと思いますが、ここではそのメンバーは特別であり、長さゼロの配列であり、この配列のサイズは 0 です。クラスとオブジェクトのサイズはすべて 0 です。

それは私の推測です。プログラムを実行すると、2 つのオブジェクトの両方にアドレスがあり、アドレスが異なることがわかります。

ここで私の質問です: サイズが 0 のオブジェクトを実装できる場合、なぜ C++ 標準は空のオブジェクトが sizeof() = 1 であると述べているのですか? それは「2 つの異なるオブジェクトのアドレスが異なることを保証するため」のためですゼロではない空のクラスの?、しかし今、出力として異なるアドレスがあります。これはどのように起こりますか?

さらに、配列セットのサイズに関係なく、最後の行の出力は常に 4 です。なぜですか?

ありがとう :)

PS: このプログラムは MacOS で実行しています。コンパイラは Apple LLVM バージョン 5.1 (clang-503.0.40) (LLVM 3.4svn ベース) です。

0 投票する
3 に答える
4019 参照

c++ - C++ が空のクラスで記述して呼び出す関数は何ですか?

『 Effective C++』という本の中で、以下の一節を見ました。

その結果、あなたが書くならば

これは、次のように記述した場合と本質的に同じです。

次のコードにより、各関数が生成されます。

しかし、上記のコードをコンパイルして作成された実行可能ファイルを逆アセンブルした後、そうではないことに気付きました。呼び出されている関数はありません。

主なアセンブリ コードは次のとおりです。

.textセグメントに「空」という名前の関数はありません。

では、コンストラクターまたは空のクラスの割り当てを呼び出した後のコンパイラーの動作は実際にはどうなるのでしょうか? 本が言ったように、それはいくつかの機能を生成しますか? もしそうなら、それらはどこに保管されていますか?