繁体   English   中英

无名结构/联合作为类私有成员

[英]Nameless struct/union as class private member

我正在研究一些代码并偶然发现这样的事情:

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;
};

或者将前者改为后者的任何理由都会破裂?

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

一般不建议使用无名结构/联合看到此URL:

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

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

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

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

如果你想保留联盟,你可以这样做:

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

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

当然有一个原因。 您的解决方案需要在内存中占用50%的空间作为带有union的版本。 而且,对于所有Foo foo; ,使用union, foo.bar = foo.baz1 Foo foo;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM