如何对联盟进行零初始化?

时间:2012-08-04 22:49:08

标签: c++

请考虑以下代码:

struct T {
    int a;
    union {
        struct {
            int a;
        } s1;
        struct {
            char b[1024];
        } s2;
    };
};

int main() {
    T x = T();
}

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

但即使没有调用explicit,我也希望x初始化为零。要做到这一点,一个想法是在他们的声明中初始化数据成员,这对于T :: a来说似乎没问题。但是如何通过使用来初始化union所占用的所有内存 同样的标准?

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
}

3 个答案:

答案 0 :(得分:6)

您可以使用memset

进行归零
memset(&x, 0, sizeof(x));

答案 1 :(得分:6)

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

但是,并集的零初始化可能不会将所有内存归零,而只会覆盖填充和第一个成员。如果第一个成员不是最大成员,则可能会留下非零内容。

由于您知道s2是最大的,因此您可以创建一个默认构造函数来将其归零:

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

现在

T x;

将归零。

答案 2 :(得分:2)

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

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

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