位元組對齊一直困擾著我,具體為什麼需要位元組對齊也不是特別清楚,貌似是因為什麼cpu的讀取相關的問題導致的。
我最近研究了一下,發現乙個非常簡單的對齊計算方式。
假設其實位址是0,那麼以後的每個變數的開始位址必須是其自身的長度的整數倍,還有,為了保證結構體中套用結構體的方式,所以結構體本身的長度需要是其最長元素的整數倍。
struct a
short a;
int b;
short c;
double d;
char e;
a::a 占用2個位元組,總位元組數為2
a::b 占用4個位元組,總位元組數不夠4的整數倍,需要補齊2個位元組,總位元組數為4+4=8
a::c 占用2個位元組,總位元組數為10
a::d 占用8個位元組,總位元組數不夠8的整數倍,需要補齊6個位元組,總位元組數為16+8=24
a::e占用1個位元組,總位元組數為25
a中最長的變數位元組數為8,總位元組數不夠8的整數倍,需要補齊7個位元組,總位元組數為32
struct b
struct a a;
char b;
b::a 占用32個位元組,總位元組數為32
b::b 占用1個位元組,總位元組數為33
b中最長的變數位元組數為8,總位元組數不夠8的整數倍,需要補齊7個位元組,總位元組數為40
c語言 結構體對齊
1 編譯器是按照什麼樣的原則進行對齊的?a.資料型別自身的對齊值 對於char型資料,其自身對齊值為1,對於short型為2,對於int,float,double型別,其自身對齊值為4,單位位元組。b.結構體或者類的自身對齊值 其成員中自身對齊值最大的那個值。c.指定對齊值 pragma pack ...
C語言結構體對齊
解析c語言結構體對齊 記憶體對齊問題 c語言結構體對齊也是老生常談的話題了。基本上是面試題的必考題。內容雖然很基礎,但一不小心就會弄錯。寫出乙個struct,然後sizeof,你會不會經常對結果感到奇怪?sizeof的結果往往都比你宣告的變數總長度要大,這是怎麼回事呢?開始學的時候,也被此類問題困擾...
c語言結構體對齊
c語言結構體對齊也是老生常談的話題了。基本上是面試題的必考題。結構體到底怎樣對齊?下面總結了對齊原則,在沒有 pragma pack巨集的情況下 原則1 普通資料成員對齊規則 第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始 比如int在32位機為 ...