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

我相信您已经知道这一点 - 如果使用联合,则内存存储在联合成员之间共享。您的第二个示例将为所有项目分配单独的存储空间,但第一个示例不会(在 bar 和匿名结构之间共享)。

一般不建议使用无名结构/联合,请参阅此 URL:

为什么 C++ 不允许匿名结构和联合?

我可以看到将示例 2 更改为 1 中断,但不是 1 到 2 中断,除非您依赖于存储在联合中共享的事实(这是非常糟糕的做法)..

于 2012-05-09T21:04:35.987 回答
1

将编译器警告级别设置为 4 将发出此警告。

union是的,有人更喜欢 a而不是a 是有原因的struct。这两种数据结构非常不同。我不会讨论支持或反对union这里的原因,因为这超出了范围,但这里有一个链接。

如果您想保留工会,您可以这样做:

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

请注意,Foo现在有一个名为thing_type的成员union

于 2012-05-09T21:07:55.733 回答
0

当然是有原因的。您的解决方案需要比带有联合的版本多 50% 的内存空间。此外,与工会一起,foo.bar = foo.baz1为所有人Foo foo;

于 2012-05-09T21:06:00.363 回答