學習筆記 非受限聯合體

2021-06-25 12:50:04 字數 1504 閱讀 4793

union

test

;

int

main()

c++98中,上述**無法編譯通過。列舉中的std::string不是pod。
用反證法解釋一下。
假設t.s="abc"編譯成功,則t.i=100會直接破壞string中的指標資料。
c++11中,上述**也無法編譯通過。
但是原因是說,test的預設構造,析構等函式都被打上了delete標誌。
相當於 test::test() = delete ; 

~test::test() = delete ;

直覺上,讓int和string共享相同的儲存空間好像能實現,只要小心處理一下即可。
我們只要重新定義test的建構函式,析構函式,賦值函式等等......
這就是非受限聯合體的由來,你可以混用std::string和int,只要不要胡來即可。
#include

#include

using

namespace

std;

union

test

type;

//discriminant

inti_;

std::string

s_;

test&operator=(const

test&w);

test(int);

test(std::string);

~test();
};
test::test(int

i)

test::test(std::string

s)

test&

test::operator=(const

test&w)

if(type==tag::text)

s_.~string();

//destroy

(explicitly!)

switch

(w.type)

type

=w.type;

return

*this;

}
test::~test()
}
int

main()

聯合體union筆記

當多個資料需要共享記憶體或者多個資料每次只取其一時,可以利用聯合體 union 1 聯合體是乙個結構 2 它的所有成員相對於基位址的偏移量都為0 3 此結構空間要大到足夠容納最 寬 的成員 4 其對齊方式要適合其中所有的成員 下面解釋這四條描述 由於聯合體中的所有成員是共享一段記憶體的,因此每個成員...

union聯合體學習

union,中文名 聯合體 共用體 在某種程度上類似結構體struct的一種資料結構,共用體 union 和結構體 struct 同樣可以包含很多種資料型別和變數。不過區別也挺明顯 結構體 struct 中所有變數是 共存 的 優點是 有容乃大 全面 缺點是struct記憶體空間的分配是粗放的,不管...

union聯合體學習

union,中文名 聯合體 共用體 在某種程度上類似結構體struct的一種資料結構,共用體 union 和結構體 struct 同樣可以包含很多種資料型別和變數。不過區別也挺明顯 結構體 struct 中所有變數是 共存 的 優點是 有容乃大 全面 缺點是struct記憶體空間的分配是粗放的,不管...