web-dev-qa-db-ja.com

参照には保存場所がありますか?

参照には保存場所がありますか、それとも単なる別の場所のエイリアスですか?これはC++のリビジョンによって異なりますか、それともC++のすべてのバージョンで一貫していますか?そして、参照に格納場所がある場合、型のようなポインタで値のセマンティクスを許可するだけですか?

そのように使用すると、参照はどのように機能しますか?

struct aStruct{
   int aVariable;
   aClass& aReferencetoaClass;
};

それはスペースをとりますか、それともエイリアスですか?

23
Tarick Welling

最新のC++ 20仕様 (§9.2.3.3)および少なくとも C++ 2005ドラフト仕様 以降の状態:

参照にストレージが必要かどうかは指定されていません

実際の実装はケースバイケースです。明らかに、クラスに、どこかに格納する必要がある参照である単一のメンバー変数がある場合。しかし、コンパイラーは、参照をエイリアスとしてのみ使用する場合に余裕があります。

16
Paul Evans

ほとんどのコンパイラは、少なくともC++ 17までのC++標準の場合、最適化されない限り、参照をポインタとして効果的に実装します。

特に、structの内部では、ポインターのサイズ(および配置/パディングなど)を占有します。

したがって、これはほとんどの環境で保持されます。

struct S {
    char & a;
};

static_assert(sizeof(S) == sizeof(void *));
10
Acorn