2010-12-21 77 views
3

是否有保證,如果我們在堆棧中創建此類型的對象,該對象的內存將正確對齊?與工會的內存對齊問題

union my_union 
{ 
    int value; 
    char bytes[4]; 
}; 

如果我們在堆棧中創建char字節[4],然後嘗試將其轉換爲整數,則可能存在對齊問題。我們可以通過在堆中創建它來避免這個問題,但是,是否存在聯合對象的這種保證?邏輯上應該有,但我想確認一下。

謝謝。

回答

3

那麼,這取決於你的意思。

如果你的意思是:

都將工會的intchar[4]成員正確對齊,這樣我可以獨立使用它們彼此?

然後是的。如果你的意思是:

請問intchar[4]成員保證對齊佔用的空間相同數量,這樣我可以通過char[4]訪問int的單個字節?

然後沒有。這是因爲sizeof(int)不保證是4.如果int s是2個字節,那麼誰知道union(標準沒有指定)中哪兩個char元素將對應於int

如果你想使用一個工會來訪問int的單個字節,使用此:

union { 
    int i; 
    char c[sizeof(int)]; 
}; 

由於每個成員都是相同的大小,他們保證佔用相同的空間。這是我相信你想知道的,我希望我已經回答了。

+0

在舊的C代碼中,他們用來聲明它爲'c [0]'。然後像正常一樣訪問它。不確定這在C++中是否仍然有效。 – 2010-12-21 06:31:15

+0

我的意思是第一。謝謝你的回答。 – confucius 2010-12-21 08:13:36

+0

@Martin - 可能不會,但我相信'c [1]'也可以。 – 2010-12-21 22:44:57

1

是的,否則工會將完全無用。

+0

同意。這也是我的印象,但最好確認一下。謝謝:) – confucius 2010-12-21 08:15:10