C 中結構體內存對齊規則

2021-10-01 11:55:28 字數 2749 閱讀 5449

c語言中結構體內存對齊規則

對齊規則:

記憶體偏移為該資料型別的最小整數倍

總體占用記憶體為結構體中最大資料型別的整數倍

舉個?:

首先,要搞清楚每一種資料型別占用記憶體為多少,在這裡,是針對64位linux(macos)為例的

nslog

(@"char:%zd"

,sizeof

(char))

;nslog

(@"double:%zd"

,sizeof

(double))

;nslog

(@"long:%zd"

,sizeof

(long))

;nslog

(@"long long:%zd"

,sizeof

(long

long))

;nslog

(@"char *:%zd"

,sizeof

(char*)

);nslog

(@"int:%zd"

,sizeof

(int))

;nslog

(@"short:%zd"

,sizeof

(short))

;

輸出結果為:

test[

5517

:167810

]char:1

test[

5517

:167810

]double:8

test[

5517

:167810

]long:8

test[

5517

:167810

]long

long:8

test[

5517

:167810

]char*:

8test[

5517

:167810

]int:4

test[

5517

:167810

]short

:2

typedef

struct

;char ddf;

}sl;

分析過程
int

main

(int argc,

const

char

* ar**)

return0;

}

輸出結果:

2019-12

-1522:

35:17.371774

+0800 test[

5079

:150310]56

program ended with exit code:

0

從這裡可以看出,總體占用記憶體空間為56個位元組

分析:

根據上面占用位元組可知:char * a指標型別占用8個位元組

根據上面占用位元組可知:char b占用1個位元組,所以,到這裡,占用位元組數為9同2中可知,char c占用1個位元組所以,到這裡,占用位元組總數為10根據上面占用位元組可知:short e占用2個位元組,這裡要注意需要對齊2的最小整數倍,在這裡,因為已經到了10,正好是2的最小整數倍,所以,從10開始占用2個位元組,加起來應該是12個位元組

根據上面占用位元組可知:int aa占用4個位元組,要對齊4的最小整數倍,12正好是4的整數倍,所以,從12開始占用4個位元組,到這裡一共占用位元組數為16根據上面占用位元組可知:long bbb占用8個位元組,這裡要對齊8的最小整數倍,現在已經是16了,正好是8的整數倍,所以從16開始,占用8個位元組,到這裡為24short ddd占用2個位元組,對齊2的整數倍,從24開始占用2個位元組,到這裡一共占用26結構體中分析方法和正常分析方法乙個邏輯:int ccc占用4個位元組,要對齊4的已占用記憶體的最小整數倍,4*8 = 32,所以要從32開始占用4個位元組,最後為36short bb,占用2個位元組,對齊2的整數倍,從36開始,占用2個位元組,最後為38char * ee占用8個位元組,要對齊8的整數倍,從40開始,占用8個位元組,最後為48最後乙個char ddf,占用1個位元組,到這裡為49

最後輸出結果為什麼是56呢,根據上述對齊原則,輸出結果為結構體中最大占用位元組的整數倍,結構體中最大占用位元組為8,現在總占用位元組數為49,所以輸出為8的整數倍56

結構體內存對齊規則

今天又聽了一遍結構體內存對齊規則,明白了 按照結構體內存規則來計算,再遇到結構體套結構體或結構體套陣列的情況,也能計算清楚。include stdafx.h include include include include struct tagtest 結構成員的對齊開始位址由結構成員size和預設對...

結構體內存對齊規則

記憶體對齊是出於提高記憶體訪問效率的考慮,其記憶體對齊規則如下 1 結構體中第乙個成員的位址偏移 offset 為0 2 其餘成員按照定義順序,其位址偏移量為各自對齊數的整數倍 3 最終結構體的整體大小為其最大對齊數的整數倍,不足在末尾補齊。4 對於內部巢狀了結構體的情況,其對齊數為該內嵌結構體的最...

結構體內存對齊規則

4.補充 5.總結 宣告乙個結構體型別,它所佔位元組為所有成員的位元組的總和?顯然是錯誤的基本的資料型別有char int double float。這個條件是很重要的,當你把結構體所佔記憶體位元組數算出來以後,你不要立即下結論,這個時候你要看看此時的值是否為最寬基本資料型別大小的整數倍。而往往有人...