我正在处理一些代码,并发现了类似这样的事情:
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;
};
或者将前者改为后者的任何理由都会破裂?
答案 0 :(得分:1)
我相信你已经知道了 - 如果使用联盟 内存存储在union的成员之间共享。 您的第二个示例将为所有项目分配单独的存储空间 但第一个例子不会(在bar和匿名之间共享 结构)。
一般不建议使用无名结构/联合 看到这个网址:
Why does C++ disallow anonymous structs and unions?
我可以看到改变示例2到1的破坏,但不是1到2破坏 除非您依赖于共享存储的事实 一个联盟(这是非常糟糕的做法)..
答案 1 :(得分:1)
将编译器警告级别设置为4将发出此警告。
是的,有理由为什么有人会选择union
到struct
。这两种数据结构非常不同。我不会在此处查明或反对union
的原因,因为这超出了范围,但here's是一个链接。
如果你想保留工会,你可以这样做:
class Foo
{
private:
union {
int bar;
struct {
int baz1;
int baz2;
} thing_;
};
};
请注意,Foo
现在有一个名为thing_
的成员union
。
答案 2 :(得分:0)
当然有理由。您的解决方案需要在内存中占用50%的空间作为带有union的版本。此外,通过联合,foo.bar = foo.baz1
适用于所有Foo foo;