在c語言中,可以通過#pragma pack(n)來指定結構體按n位元組對齊(這裡的n是2的較小整數次冪)。如果程式設計者不指定對齊位元組數,那麼預設的會按照結構體中最長那一項對齊,如在64位作業系統中,當結構體中出現(void *),(long)型別,則必然是按照8位元組對齊;當最大的是int,那麼就按照4位元組對齊;對於陣列,如結構體中有int陣列int a[20],也是4位元組對齊的,只跟資料型別有關。
這裡,看一下如下**以及執行結果
#include#include//#pragma pack(2)//注釋掉這一行,按照預設的對齊方式
struct test
;void print(struct test *p)
int main()
執行結果如下
對這裡的結果進行分析,不論是在堆還是棧中,記憶體布局形式是一樣的,如下圖
可以看出,由於long型別p的存在,資料結構按照8位元組對齊,其中白色部分為未使用部分,如果調整一下資料結構存放的位置,如把c1放在ch後面,那麼可以節約8位元組的空間。
給定乙個資料結構,如果是預設對齊方式,如何判斷所佔位元組數呢?這裡有乙個比較簡單但又拗口的方法,以部落格中的資料結構為例,將結構體test分成三部分abc,其中a為p前面的變數構成的虛擬結構體,b為long型別變數p,c為p後面的變數構成的虛擬結構體,那麼sizeof(struct test) = sizeof(a)按8位元組對齊 + sizeof(b) + sizeof(c)按8位元組對齊。sizeof(c)的計算方式同sizeof(struct test)是相同的,也就是說這裡是乙個遞迴的方式計算,遞迴結束的條件是虛擬結構體中只有乙個變數。計算sizeof(a)時,其結果為4;計算sizeof(c)時,就以int進行分割,得到sizeof(c)的值為(1按4位元組對齊 + 4 + 1按四位元組對齊),即12;最終算的sizeof(struct test) = 32。
當然,也可以畫出對應的記憶體布局圖,按照最長的那個對齊也能很明顯的看出結果來。
結構體內存對齊 和共用體
這個人寫得差不多了.關於結構體內存對齊 差不多一般的就 3條 自己算去吧 struct p1 struct p2 struct p3 struct p4 struct p5 全部算對應該 才開始啊.struct a struct b sizeof struct b 64位機器上是 32 首先 cha...
結構體內存對齊
結構體內存對齊 一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這...
結構體內存對齊
一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的...