[問題] 結構的記憶體對齊問題

看板C_and_CPP (C/C++)作者 (處處留心皆正妹)時間14年前 (2012/02/17 04:05), 編輯推噓3(302)
留言5則, 2人參與, 最新討論串1/1
開發平台(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
MS的VC有#pragma pack(n)可以設定,g++也有類似的東西
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)
文章代碼(AID): #1FFM6Z5K (C_and_CPP)
文章代碼(AID): #1FFM6Z5K (C_and_CPP)