3

私はいくつかのコードに取り組んでいて、次のようなものに出くわしました:

class Foo
{
private:
  union {
    byte bar;
    struct {
      byte baz1;
      byte baz2;
    };
  };
};

現在、VS 2010(純粋なアンマネージド)で警告レベル4でコンパイルしています。もちろん、VSは、名前のない構造体/共用体が非標準の拡張体であると文句を言います(警告C4201)。その警告を修正したいと思います。

誰かが上記を好む理由はありますか?

class Foo
{
private:
  byte bar;
  byte baz1;
  byte baz2;
};

または、前者を後者に変更すると壊れてしまう理由はありますか?

4

3 に答える 3

2

あなたはすでにこれを知っていると確信しています-ユニオンが使用されている場合、メモリストレージはユニオンのメンバー間で共有されます。2番目の例では、すべてのアイテムに個別のストレージを割り当てますが、最初の例では割り当てません(barとanonymous構造体の間で共有されます)。

名前のない構造体/共用体は一般的に推奨されていません。次のURLを参照してください。

C ++が匿名の構造体と共用体を許可しないのはなぜですか?

ストレージがユニオンで共有されているという事実に依存しない限り、例2から1のブレークを変更することはできますが、1から2のブレークは表示されません(これは非常に悪い習慣です)。

于 2012-05-09T21:04:35.987 に答える
1

コンパイラの警告レベルを4に設定すると、この警告が発行されます。

はい、誰かがを好む理由がありunionますstruct。2つのデータ構造は大きく異なります。unionここでは範囲を超えているため、ここでの理由や反対の理由については説明しませんが、ここにリンクがあります。

組合を維持したい場合は、これを行うことができるかもしれません:

class Foo
{
private:
  union {
    int bar;
    struct {
      int baz1;
      int baz2;
    } thing_;
  };
};

タイプが。Fooという名前のメンバーがあることに注意してください。thing_union

于 2012-05-09T21:07:55.733 に答える
0

確かに理由があります。あなたのソリューションは、ユニオン付きのバージョンよりもメモリに50%多くのスペースを必要とします。さらに、組合と一緒に、foo.bar = foo.baz1すべての人のためにFoo foo;

于 2012-05-09T21:06:00.363 に答える