資料結構的對齊

2021-08-15 06:23:57 字數 1049 閱讀 8818

linux的對齊策略是 2位元組資料型別的位址必須是2的倍數,而較大的資料型別(例如 int, int *, float, double,long long)的位址必須是4的倍數.

windows的對齊策略更加嚴格,認可k位元組基本型別物件的位址都必須是k的倍數.

結構體的對齊,除了每個結構體成員對齊以外,還要滿足,結構體的大小是結構體中最大對齊位元組的倍數.結構體本身的對齊以結構體中所有成員中最大的對齊位元組來進行.

structs1;

structs2;

在linux 中, double的對齊位元組是4,而linux中,double的對齊位元組是8

linux 中,上面的s1的位元組數是12,s2的位元組數是20

windows中,上面的s1的位元組數是16,s2的位元組數是32

存在#pragma pack巨集的對齊(

另外,在gnu c中還有乙個

__attribute__ ((aligned (n)))

指令,可以達到類似的效果。

)?1 2

#pragma pack (n)  //編譯器將按照n個位元組對齊

#pragma pack ()   //取消自定義位元組對齊方式

對齊規則:

結構,聯合,或者類的資料成員,第乙個放在偏移為0的地方,以後每個資料成員的對齊,按照#pragma pack指定的數值和自身對齊模數中較小的那個。

例8:按指定的對齊模數?1 2

3456

78

#pragma pack (2) /*指定按2位元組對齊*/

structg;

#pragma pack () /*取消指定對齊,恢復預設對齊*/

在結構體g中成員變數的最大對齊模數是sizeof(double)=8;又因為指定對齊模數是2;所以取其較小者2為結構體g的最大對齊模數;則sizeof(g)=2+4+8+2=16;由於16是2的整數倍,則不需要填充。

資料結構對齊原則

一種資料結構 c語言中聚合資料型別的一類 可以被宣告為變數 陣列 指標等,用以實現比較複雜的資料結構 是一系列元素的集合,這些元素被稱為結構體成員 結構體成員需要用結構體名訪問。struct as1 s1是結構體變數 一般情況下,宣告出現三個部分的兩個部分即可 標誌或者變數可省略 結構體可以包含其他...

gcc資料結構對齊之 why

gcc 支援 aligned 和 packed 屬性指定資料對齊,那麼在了解對齊規則之前,需要解決第乙個以為,我們為什麼需要資料對齊?請看下圖 相信學過彙編的朋友都很熟悉這張圖,這張圖就是cpu與記憶體如何進行資料交換的模型,其中,左邊藍色的方框是cpu,右邊綠色的方框是記憶體,記憶體上面的0 3是...

資料結構 資料結構的概述

一 概述 什麼是資料結構 資料 由有限的符號 比如,0 和 1 具有其自己的結構 操作 和相應的語義 組成的元素的集合。結構 元素之間的關係的集合。資料結構 資訊的一種組織方式,其目的是為了提高演算法的效率,它通常與一組演算法的集合相對應,通過這組演算法集合可以對資料結構中的資料進行某種操作。它用來...