2010-02-05 38 views
1
的工會

比方說,我在它與工會成員的類:分配給會員

class ClassX { 
public: 
    union { 
    StructA * A; 
    StructB * B; 
    }; 
    } 

如果我有一個指針x1和x2不同ClassX對象,做到這一點:

x1->A = x2->A; 

有效果如下:

x1->B = x2->B; 

?謝謝。

+1

那是什麼的預期。聯盟意味着A和B在內存中佔據相同的位置。 – kenny 2010-02-05 18:58:06

回答

5

對於大多數實際用途,在大多數實現中,這兩個語句會產生相同的效果,但不能保證。如果從工會讀取的成員不是寫入工會的最後一個成員,則該程序的行爲未定義。

因爲聯合的兩個成員都是指向結構體的指針,所以它們很可能佔據相同的大小並且具有類似的表示,因此如果這是實際存儲在其中的聯合成員可能正確分配另一個聯合成員,源聯盟。

0

這些不具有相同的效果,除非StructA和StructB具有相同的大小。您發佈的第一行將x2->A佔用的所有內存複製到x1->A,而第二行則對B執行同樣的操作。 AB佔用內存的重疊區域,但它們可能是不同的大小,在這種情況下這兩個語句是不等價的。

+0

這些是被複制的結構指針,而不是結構體。可以肯定的是,無論基礎結構的內容如何,​​這些大小都是相同的。 – 2010-02-05 18:59:55

+0

x2-> A是一個指針。它可能會工作,除非指針具有不同的大小或對齊要求。實現爲不同的結構使用不同的指針表示是很少見的。 – 2010-02-05 19:00:49

0

操作應該是相同的。但是,如果您已經爲這兩種指針類型中的任何一種重載了賦值運算符,情況就不會如此。

+1

嗯......你不能爲指針重載賦值。即使你重載'StructA'分配,這仍然是構建在指針和無關'StructA'的重載賦值操作符'StructA * A的分配; StructA * b; A = B;' – 2010-02-05 19:06:45

+0

你說得對 - 分配只能重載爲成員函數。我不知何故想到你可以寫出「A *操作符=(A *,B *);」 – 2010-02-08 23:46:34

2

你期望什麼樣的答案?

一個正式和迂腐的嗎?如果是這樣,那麼這個問題根本就沒有答案。 C++語言確實給你任何正式的機會來比較這兩個任務的效果。如果您分配了ClassX::A,則只能讀取ClassX::A而不能讀取ClassX::B。如果您分配了ClassX::B,則只能閱讀ClassX::B而不能閱讀ClassX::A。換句話說,即使關心效果是否相同,也沒有任何意義。這種語言根本不允許你關心它。如果你的代碼在某種程度上依賴於它,那麼就正式的C++而言,它的行爲是不確定的。

至於那個問題的現實生活中的實際答案......是的,在語言的任何合理實施中效果應該是相同的。

+0

不好意思讓你失望,但是像「你期待什麼樣的答案?」似乎是不必要的煽動性的,並且會導致甚至忽略好信息。如果我注意到帖子改變的更好,我會把它撞上去。 – Sqeaky 2010-03-17 22:48:39

1

C++1x Standard Draft, Section 9.5.1

在聯合中,數據中的至多一個 成員可以在任何時候被激活, 即,數據成員可被存儲在一個的 至多一個的值 工會在任何時間。 [注意:爲了簡化 聯合的使用,提供了一個特殊的 保證:如果POD聯合 包含幾個POD結構,其中 共享一個共同的初始序列 (class。mem),並且如果此POD-union類型的對象包含 POD-structs之一,則允許 檢查任何POD-struct成員的公共初始序列;請參閱 class.mem。 ]

請注意特殊保障。

+0

雖然這個特別的保證並不適用於此。這個聯盟沒有任何結構。 – AnT 2010-02-05 20:03:56