我有一个看起来像这样的结构:
class Foo {
union {
size_t cap;
char buff[15];
};
bool isHeap;
};
我希望sizeof(Foo)
等于16
,但是sizeof(Foo)
在64位计算机上是24
。我认为这是因为size_t
强制将并列的对齐方式设置为8
,因此1
后紧跟buff
之后的7
造成了isHeap
浪费字节。我想到了这个解决方案:class Foo {
union{
struct {
size_t cap;
char ignore[7];
bool isHeap1;
};
struct {
char buff[15];
bool isHeap2
};
};
};
但这依赖于未定义的行为,因为您直到访问了它们的值之一才知道是否要检查isHeap1
或isHeap2
。有没有办法不浪费那些不依赖未定义行为的字节?
顺带一提,如果有人能提出更好的建议,那我就想不出这个问题的好名字了。如果建议使用更好的名称,或者大家都认为它已经是一个合理的名称,我将删除此评论。
最佳答案
C++没有匿名结构。这在C++中是不正确的。
如果成员的顺序灵活,那么这将是一个明确定义的替代方案:
union {
struct {
bool isHeap;
size_t cap;
} s1;
struct {
bool isHeap;
char buff[15];
} s2;
};
这是允许访问联合的不 Activity 成员的特殊情况:两个标准布局结构的公共(public)初始序列。换句话说,即使s1
是 Activity 成员,也可以很好地定义s2.isHeap
的读取,并读取s1.isHeap
的值,反之亦然。