是否有保證,如果我們在堆棧中創建此類型的對象,該對象的內存將正確對齊?與工會的內存對齊問題
union my_union
{
int value;
char bytes[4];
};
如果我們在堆棧中創建char字節[4],然後嘗試將其轉換爲整數,則可能存在對齊問題。我們可以通過在堆中創建它來避免這個問題,但是,是否存在聯合對象的這種保證?邏輯上應該有,但我想確認一下。
謝謝。
是否有保證,如果我們在堆棧中創建此類型的對象,該對象的內存將正確對齊?與工會的內存對齊問題
union my_union
{
int value;
char bytes[4];
};
如果我們在堆棧中創建char字節[4],然後嘗試將其轉換爲整數,則可能存在對齊問題。我們可以通過在堆中創建它來避免這個問題,但是,是否存在聯合對象的這種保證?邏輯上應該有,但我想確認一下。
謝謝。
那麼,這取決於你的意思。
如果你的意思是:
都將工會的
int
和char[4]
成員正確對齊,這樣我可以獨立使用它們彼此?
然後是的。如果你的意思是:
請問
int
和char[4]
成員保證對齊佔用的空間相同數量,這樣我可以通過char[4]
訪問int
的單個字節?
然後沒有。這是因爲sizeof(int)
不保證是4.如果int
s是2個字節,那麼誰知道union
(標準沒有指定)中哪兩個char
元素將對應於int
?
如果你想使用一個工會來訪問int
的單個字節,使用此:
union {
int i;
char c[sizeof(int)];
};
由於每個成員都是相同的大小,他們保證佔用相同的空間。這是我相信你想知道的,我希望我已經回答了。
在舊的C代碼中,他們用來聲明它爲'c [0]'。然後像正常一樣訪問它。不確定這在C++中是否仍然有效。 – 2010-12-21 06:31:15
我的意思是第一。謝謝你的回答。 – confucius 2010-12-21 08:13:36
@Martin - 可能不會,但我相信'c [1]'也可以。 – 2010-12-21 22:44:57