如何对并集进行零初始化

How to zero-initialize an union?

本文关键字:初始化      更新时间:2023-10-16

考虑以下代码:

struct T {
    int a;
    union {
        struct {
            int a;
        } s1;
        struct {
            char b[1024];
        } s2;
    };
};
int main() {
    T x = T();
}

由于调用了显式构造函数,上述代码最终零初始化x中的所有数据成员。

但我希望x零初始化,即使没有调用显式。要做到这一点,一个想法是初始化声明中的数据成员,这似乎对T::a来说是可以的。但是,如何使用相同的标准?

struct T {
    int a = 0;
    union {
        struct {
            int a;
        } s1;
        struct {
            char b[1024];
        } s2;
    };
};
int main() {
    T x; // I want x to be zero-initialized
}

您可以使用memset:归零

memset(&x, 0, sizeof(x));

对于没有用户定义的默认构造函数的并集,值初始化零初始化

然而,并集的零初始化可能不会使所有内存为零,而是仅使填充和第一个成员为零。如果第一个成员不是最大的,则可能会留下非零内容。

既然您知道s2是最大的,您就可以创建一个默认的构造函数来将其归零:

struct T
{
    int a;
    union {
        int s1a;
        char s2b[1024];
    };
    T() : a(), s2b() {}
};

现在

T x;

将被归零。

我建议实现T:的构造函数

struct T {
    int a;
    union {
        struct {
            int a;
        } s1;
        struct {
            char b[1024];
        } s2;
    };
    T() : a(), s2() {} // <- proper initialisation
};

在这种情况下,我选择了union中最大的成员,因为它是透明的。否则,您可以显式地创建union本身。