共用体の制限について
C では、共用体は複数のデータ メンバーによって共有されるメモリ領域を表します。ただし、コンパイラは、共用体内の非自明なコンストラクタ、コピー コンストラクタ、またはデストラクタを持つクラスの使用を制限します。
問題
共用体を宣言しようとするとき以下に示すように、文字列メンバー:
union U { int i; float f; string s; };
コンパイラは、U::s にコピー コンストラクターがあることを示すエラーを発生させます。
なぜ制限があるのですか?
この制限が存在するのは、共用体内に非自明な操作を含むクラスがあると、メモリ管理の問題が発生するためです。一般的な構造体では、各メンバーに独自のメモリが割り当てられます。ただし、共用体では、すべてのメンバーが同じメモリ アドレスを共有します。
次の例を考えてみましょう:
union U { string x; vector<int> y; }; U u; // <--
u が構造体の場合、u.x と u.y は空の文字列に初期化されます。とベクトル、それぞれ。ただし、ユニオンでは、u.x と u.y は同じアドレスを共有します。したがって、一方を初期化すると、もう一方のデータが上書きされます。
代替案: タグ付き共用体と拡張性
この問題に対処するために、C 0x では「タグ付き共用体」が導入されました。 」これらの共用体を使用すると、どのメンバーがアクティブであるかを示すメンバー変数の使用が可能になり、共用体内のクラス メンバーのより柔軟な構築と破棄が可能になります。
代わりに、Boost.Variant や Boost.Any などの外部ライブラリが提供します。メモリ管理の複雑さをカプセル化しながら、同様の機能を実現します。
以上がC 共用体では非自明なコンストラクターを持つクラスを使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。