[問題] 結構的記憶體對齊問題
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
GCC on Linux
問題(Question):
structure裡面的 記憶體alignment
程式碼(Code):(請善用置底文網頁, 記得排版)
struct abc{
int a;
char b;
int c;
char d;
}
補充說明(Supplement):
請問這個struct 的 sizeof是16
因為為了效率上的改善,因此在記憶體的配置上要做對齊
所以a的 address 在編譯階段一定就會配 4的倍數為基底位置給它
然後b的位置要考慮到後面的c,所以b要多加3個bytes的padding下去
置於c就是一樣4個byte,最後到 d要加3個bytes的padding下去是因為
考慮這個structure配置成陣列後也要連續,因此考量到 int a是4個byte
因此要多加3個bytes的padding給 d,好讓後面的 int a也可以是4的倍數
這觀念正確嗎??
Thanks!!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.224.207.71
推
02/17 04:12, , 1F
02/17 04:12, 1F
→
02/17 04:13, , 2F
02/17 04:13, 2F
推
02/17 14:00, , 3F
02/17 14:00, 3F
→
02/17 14:02, , 4F
02/17 14:02, 4F
推
02/17 16:31, , 5F
02/17 16:31, 5F
thanks all
我發現我在最後的變數大小的padding那邊觀念好像有誤.
一個struct的大小應該是成員裡面sizeof最大的那個數值的倍數.
因此如果一個structure是長這樣
struct abc{
char a;
double e;
short b;
int c;
char d;
};
那麼sizeof(struct abc)的大小會看裡面佔記憶體最大的double,size是8
最後struct一定要是8的倍數,因此在char d的後面要多加7 bytes的padding給它
讓最後整個structure大小變成32.
如果是照之前我有誤的觀念,它是看到char a,其實 char 型態的位置怎麼放都行
那麼 char d就不需加padding了@@
※ 編輯: HowLeeHi 來自: 61.224.207.71 (02/17 23:57)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章