19

32 ビット マシンではsizeof、double への参照であっても常に 4 バイトの参照を取得するため、実際にはこの 4 バイトに何が格納されるのでしょうか。

編集 :

class A{
public:
  double&  a;
};

int main(){
  cout << sizeof(A) << endl; // this will print out 4
}
4

2 に答える 2

47

標準はsizeof(C++ 11、5.3.3/4)でかなり明確です:

参照または参照型に適用すると、結果は参照される型のサイズになります。

したがって、実際に を取得しているsizeof(double&)場合、コンパイラはそれsizeof(double)が 4 であることを示しています。

更新:つまり、実際に行っているのはsizeofクラス型への適用です。その場合、

クラスに適用すると、結果はそのクラスのオブジェクトのバイト数になります [...]

Aしたがって、内部に参照が存在すると、 4 バイトを占めることがわかります。これは、標準が参照の実装方法を義務付けていなくても、コンパイラは何らかの方法で参照を実装する必要があるためです。これはコンテキストによってはかなり異なる場合がありますが、クラス型の参照メンバーの場合、意味のある唯一のアプローチは、double*背後に忍び込んでdouble&顔に a を呼び出すことです。

したがって、アーキテクチャが 32 ビット (ポインタの長さが 4 バイト) である場合、それで結果が説明されます。

参照の概念は特定の実装に結び付けられていないことに注意してください。標準では、コンパイラは必要に応じて参照を実装できます。

于 2012-05-04T10:21:59.927 に答える
29

あなたはできません、そしてそうではありません。

C++ 参照はポインターではありません。オブジェクトのエイリアスです。場合によっては、コンパイラはポインターを使用してこれを実装することを選択します。しかし、多くの場合、何もせずに実装します。元のオブジェクトを直接参照するコードを生成するだけです。

いずれにせよ、sizeof参照型に適用しても、参照のサイズはわかりません。そのため、何をしているのかが明確ではなく、何が起こっているのかを説明することができません。

編集

いくつかのコードを示したので、次の質問に答えることができます。

参照を含むクラスのサイズを取得しています。上で述べたように、参照はポインターではありませんが、必要に応じて、コンパイラーはそれを表すためにポインターを使用するようにフォールバックする場合があります。参照を含むクラスを作成する場合、コンパイラがそれを実装できる唯一の (正気の) 方法は、オブジェクトのアドレスを保持するクラスを定義することです。32 ビット システムでは、アドレスは 32 ビットまたは 4 バイト幅です。したがって、そのsizeofようなクラスは (通常) 4 になります。

于 2012-05-04T10:22:49.087 に答える