資料結構對齊原則

2021-10-24 22:32:09 字數 2082 閱讀 3682

一種資料結構;

c語言中聚合資料型別的一類;

可以被宣告為變數、陣列、指標等,用以實現比較複雜的資料結構;

是一系列元素的集合,這些元素被稱為結構體成員;

結構體成員需要用結構體名訪問。

struct as1; //s1是結構體變數

一般情況下,宣告出現三個部分的兩個部分即可(標誌或者變數可省略)

結構體可以包含其他結構體,也可以包含指向自己的指標

結構體互相包含時,需要對其中乙個進行不完整宣告

計算結構體大小不是元素單純相加;

32位cpu取四個位元組比乙個位元組更高效方便;

若每個元素首位址都是4的整數倍,取資料元素就能更高效方便;

每個特定平台上編譯器都有自己的預設的對齊係數(對齊模數),可通過編譯命令來改變這一係數;

#pragma pack(n);//n=1,2,4,8,16,其中n就是你想要指定的係數。

一般情況下32位預設4位元組對齊。

1、平台原因(移植原因)

不是所有的硬體平台都能訪問任意位址的任意資料,某些硬體平台只能在某些位址處取某些特定型別的資料的,否則丟擲硬體異常。

2、效能原因

資料結構(尤其是棧),應該盡可能在自然邊界上對齊,因為在訪問為對齊的記憶體時,處理器需要訪問兩次,而對齊的記憶體處理器只需要訪問一次。

1.下面的結構體大小分別是多大(假設32位機器)?

struct a 

;

//進行整體對齊,最大型別為1《對齊係數4,按1整體對齊,所以1+1+1=3

struct b 

;

//進行整體對齊,最大型別為4=對齊係數4,所以按4整體對齊4 1+2=3<4 對齊4 所以4+4=8

struct c 

;

//進行整體對齊,最大型別為4=對齊係數4,所以按4整體對齊 1<4(對齊4) 4=4 2<4(對齊4) 所以4+4+4=12

#pragma pack(2)

struct d 

;

//進行整體對齊,最大型別為4>對齊係數n(2),所以按2整體對齊 1<2(對齊2)4>2(2的倍數) 2=2 所以2+4+2=8

答案及解析:3 8 12 8

有乙個如下的結構體:

struct a

;

請問在64位編譯器下用sizeof(struct a)計算出的大小是多少?

2428

1618

答案及解析:24

64位編譯器下:指標8位元組(一定不能忘記),題目不說預設4位元組對齊

long a1;

//8short a2;

//2 8+2=10(不是4的倍數)對齊到4的倍數12

int a3;

//4 4+12=16(4的倍數)

int*a4;

//8 8+16=24(4的倍數)

3.在32位cpu上選擇預設對齊的情況下,有如下結構體定義:

struct a

;

則sizeof(struct a)的值為()912

1620

答案及解析16

題目不說,預設4位元組對齊

19+11=30<32bit 4

4+29=33>32bit 4+4

1byte=8bit 1 對齊到 4

4+4+4+4=16

c++中的結構體struct—類

在c++中struct是對於c語言中struct的擴充套件,因為c++是物件導向的語言,可以描述物件的行為,所以在c++中struct內可以放函式,從而就具有類的功能,但又和class有一定的區別。

class和struct的區別

class預設成員是私有的private,struct預設成員是公有的public

class繼承預設是私有的private,struct繼承預設是公有的public

c++中結構體可以不要struct關鍵字,c語言中除了typedef定義別名之外是必須要struct關鍵字。

資料結構的對齊

linux的對齊策略是 2位元組資料型別的位址必須是2的倍數,而較大的資料型別 例如 int,int float,double,long long 的位址必須是4的倍數.windows的對齊策略更加嚴格,認可k位元組基本型別物件的位址都必須是k的倍數.結構體的對齊,除了每個結構體成員對齊以外,還要滿...

結構對齊的原則

結構對齊的原則 未考慮位域 原則1 資料成員對齊規則 結構 struct或聯合union 的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始 比如int在32位機為 位元組,則要從4的整數倍位址開始儲存 原則2 結構體作為成員 如果乙個結構...

資料結構記憶體邊界對齊的三條原則

struct example1 struct example2 pragma pack 在 原來那篇日誌中,通過寫程式測試發現規律後,便推測上述的strurct example2的結構大小應該是24個位元組,但ygone在vs2008上得到的結果是16個位元組,自己這才寫程式在vc6.0,vs200...