我有一个看起来像这样的结构:

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
        };
    };
};
但这依赖于未定义的行为,因为您直到访问了它们的值之一才知道是否要检查isHeap1isHeap2

有没有办法不浪费那些不依赖未定义行为的字节?

顺带一提,如果有人能提出更好的建议,那我就想不出这个问题的好名字了。如果建议使用更好的名称,或者大家都认为它已经是一个合理的名称,我将删除此评论。

最佳答案


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的值,反之亦然。

08-16 21:39