簡體   English   中英

如何對聯盟進行零初始化?

[英]How to zero-initialize an union?

請考慮以下代碼:

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本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM