[英]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.