結構體對齊幾種代表性格式
格式一:
//進行整體對齊,最大型別為4=對齊係數4,所以按4整體對齊 1<4(對齊4) 4=4 2<4(對齊4) 所以4+4+4=12
01.struct tagphone
02.phone;
格式二:
01.struct tagphone
02.phone2;
格式三:
//進行整體對齊,最大型別為1《對齊係數4,按1整體對齊
01.struct tagphone3
02.phone3;
我們都知道,char型別占用1個位元組,int型占用4個位元組,short型別占用2個位元組,long占用8個,double占用16個;
那麼我們可能會犯乙個錯誤就是直接1+4+2=7,該結構體占用7個位元組。這是錯的。
以下我們簡單分析下:
計算結構體大小時需要考慮其記憶體布局,結構體在記憶體中存放是按單元存放的,每個單元多大取決於結構體中最大基本型別的大小。
對格式一:
以int型占用4個來作為倍數,因為a占用乙個位元組後,b放不下,所以開闢新的單元,然後開闢新的單元放c,所以格式一占用的位元組數為:3*4=12;
同理對於格式二,
a後面還有三個位元組,足夠c存放,所以c根著a後面存放,然後開闢新單元存放b資料。所以格式二占用的記憶體位元組為2*4=8.
對於格式三:
上面結構計算大小,sizeof(phone3) = 1 + 2 + 4 = 7, 其大小為結構體中個字段大小之和,這也是最節省空間的一種寫法。
總結:第一種寫法,空間浪費嚴重,sizeof 計算大小與預期不一致,但是保持了每個欄位的資料型別。這也是最常見的漫不經心的寫法,一般人很容易這樣寫;
第三種寫法,最節省空間的寫法,也是使用 sizeof 求大小與預期一樣的寫法,但是全部使用位元組型別,丟失了字段本生的資料型別,不方便使用;
第二種寫法,介於第一種和第三種寫法之間,其空間上比較緊湊,同時又保持了結構體中字段的資料型別。
只要了解是這些寫法的差異性,可以視情況選用。
例:
每個單元多大取決於結構體中最大基本型別的大小:按最大的結構體對齊
關於結構體的成員對齊與結構體整體對齊
大多數計算機體系結構中,對記憶體操作時按整字訪問才能達到最高效率,相當於是以空間換取時間,看似浪費了記憶體空間,但換來了訪問效率,先來說說三個概念 系統對齊值,自身對齊值,有效對齊值,三個概念的單位均為位元組,一開始概念不懂沒關係,可以對照後面的程式和記憶體分布圖來理解 1,系統對齊值 對於不同的作...
關於結構體位元組對齊
結構體位元組對齊 在用sizeof運算子求算某結構體所佔空間時,並不是簡單地將結構體中所有元素各自佔的空間相加,這裡涉及到記憶體位元組對齊的問題。從理論上講,對於任何變數的訪問都可以從任何位址開始訪問,但是事實上不是如此,實際上訪問特定型別的變數只能在特定的位址訪問,這就需要各個變數在空間上按一定的...
關於結構體的記憶體對齊
華清遠見嵌入式培訓中心 講師。記憶體是以位元組為單位編號,但一些硬體平台對某些特定型別的資料只能從某些特定位址開始,比如從偶位址開始。若不按照適合其平台的要求對資料存放進行對齊,會影響到效率。因此,在記憶體中,各型別的資料是按照一定的規則在記憶體中存放的,這就是本文要研究的對齊問題。本文以gcc v...