ホームページ > バックエンド開発 > C++ > C 共用体では非自明なコンストラクターを持つクラスを使用できないのはなぜですか?

C 共用体では非自明なコンストラクターを持つクラスを使用できないのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-19 17:19:03
オリジナル
1008 人が閲覧しました

Why can't I use classes with non-trivial constructors in C   unions?

共用体の制限について

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート