參考:
結構體變數的首位址能夠被其最寬基本型別成員的大小所整除;
結構體每個成員相對於結構體首位址的偏移量都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組;例如上面第二個結構體變數的位址空間。
結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末乙個成員之後加上填充位元組。
各個硬體平台對儲存空間的處理上有很大的不同。一些平台對某些特定型別的資料只能從某些特定位址開始訪問。比如有些架構的cpu在訪問 乙個沒有進行對齊的變數的時候會發生錯誤,那麼在這種架構下程式設計必須保證位元組對齊.其他平台可能沒有這種情況,但是最常見的是如果不按照適合其平台要求對 資料存放進行對齊,會在訪問效率上帶來損失。比如有些平台每次讀都是從偶位址開始,如果乙個int型(假設為32位系統)如果存放在偶位址開始的地方,那麼乙個讀週期就可以讀出這32bit,而如果存放在奇位址開始的地方,就需要2個讀週期,並對兩次讀出的結果的高低位元組進行拼湊才能得到該32bit資料。1.
typedef struct node1
s1;
則sizeof(s1)=8。這是因為結構體node1中最長的資料型別是int,佔4個位元組,因此結構體總大小為4的整數倍,同時short相對於結構體首位址的偏移量為2的整數倍,故該結構體在記憶體中存放方式為:
|--------int--------| 4位元組
|char|----|-short--| 4位元組
總共佔8位元組
2.
typedef struct node2
s2;
則siezof(s3)=12.最長資料型別為int,佔4個位元組。因此結構體總大小為4的整數倍,int位置相對於結構體首位置的偏移量為4的整數倍,故其在記憶體空間存放方式如下:
|char|----|----|----| 4位元組
|--------int--------| 4位元組
|--short--|----|----| 4位元組
總共佔12個位元組
3.
typedef struct node3
s3;
則sizeof(s3)=8.這裡結構體中包含靜態資料成員,而靜態資料成員的存放位置與結構體例項的儲存位址無關(注意只有在c++中結構體中才能含有靜態資料成員,而c中結構體中是不允許含有靜態資料成員的)。其在記憶體中儲存方式如下:
|--------int--------| 4位元組
|--short-|----|----| 4位元組
而變數c是單獨存放在靜態資料區的,因此用siezof計算其大小時沒有將c所佔的空間計算進來。
4.若在程式中使用了#pragma pack(n)命令強制以n位元組對齊時,預設情況下n為8.
則比較n和結構體中最長資料型別所佔的位元組大小,取兩者中小的乙個作為對齊標準。
若需取消強制對齊方式,則可用命令#pragma pack()
如果在程式開頭使用命令#pragma pack(4),對於下面的結構體
typedef struct node5
s5;
則sizeof(s5)=24.因為強制以4位元組對齊,而s5中最長資料型別為double,佔8位元組,因此以4位元組對齊。在記憶體中存放方式為:
|-----------a--------| 4位元組
|--------s1----------| 4位元組
|--------s1----------| 4位元組
|--------b-----------| 4位元組
|--------b-----------| 4位元組
|---------c----------| 4位元組
C C 位元組對齊
什麼是對齊,以及為什麼要對齊 現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的作用和原因 各...
c c 位元組對齊
什麼是對齊,以及為什麼要對齊 現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的作用和原因 各...
C C 位元組對齊
概念 對齊跟資料在記憶體中的位置有關。如果乙個變數的記憶體位址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設乙個整型變數的位址為0x00000004,那它就是自然對齊的。為什麼位元組需要對齊 根本原因在於cpu訪問資料的效率問題。假設上面整型變數的位址不是自然對齊,比如為0x...