[英]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:
我可以看到更改示例2到1中断,但不是1到2中断,除非您依赖于存储在联合中共享的事实(这是非常糟糕的做法)..
将编译器警告级别设置为4将发出此警告。
是的,有理由为什么有人会更喜欢struct
的union
。 这两种数据结构非常不同。 我不会在这里讨论支持或反对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.