你是否有觀察過結構體中資料變數所佔的位元組數,以及結構體所佔的位元組數?
如:
圖1 圖2 圖三
你是否知道圖1,2,3中結構體所佔的位元組數麼?
在此之前,我們需要知道在32位作業系統上,int 佔 4位元組,char 佔 1 位元組,因此你可能會說,圖一結構體占有2 位元組,圖二結構體占有 3 位元組,圖三結構體占 1+1+1+4+1=8位元組,如果是這樣,可能你沒有了解到 一種 說法 「位元組對齊」
所謂 位元組對齊 是指 以使 cpu 儲存速度更快,提高效能 為目的,對 結構體 內部排列 做的一種 調整。
在一般情況下:
char 型 偏移量 為sizeof(char)即 1 的 倍數, short 型 偏移量 為sizeof(short)即 2 的 倍數
int 型 偏移量 為sizeof(int)即 4 的 倍數,float 型 偏移量 為 sizeof(float)即 4 的 倍數
double 型偏移量 為 sizeof(double)即 8 的 倍數
因此在 一般情況下:圖一為 2 位元組,圖二 為 3 位元組,圖三 為 12 位元組。具體看下方示意圖:
但在特殊情況下也可以改變 位元組對齊的方式
如:使用 #pragmapack(n) 可以改變 以 n 位元組對齊, 具體請 參考 (
c語言位元組對齊
現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。基本資料型別自身對齊,也叫自然對齊。就是說...
C語言位元組對齊
一 概念 對齊跟資料在記憶體中的位置有關。如果乙個變數的記憶體位址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設乙個整型變數的位址為0x00000004,那它就是自然對齊的。二 為什麼要位元組對齊 需要位元組對齊的根本原因在於cpu訪問資料的效率問題。假設上面整型變數的位址不...
C語言位元組對齊
一 概念 對齊跟資料在記憶體中的位置有關。如果乙個變數的記憶體位址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設乙個整型變數的位址為0x00000004,那它就是自然對齊的。二 為什麼要位元組對齊 在c語言中,結構是一種復合資料型別,其構成元素既可以是基本資料型別 如int ...