C語言結構體對齊

2022-04-07 19:03:41 字數 2082 閱讀 7589

1.結構體變數中的元素如何訪問?

(1)陣列中元素的訪問方式:表面上有2種方式(陣列下標方式和指標方式);實質上都是指標方式訪問。

(2)結構體變數中的元素訪問方式:只有一種,用.或者->的方式來訪問。(.和->訪問結構體元素其實質是一樣的,只是c語言規定用結構體變數來訪問元素用. 用結構體變數的指標來訪問元素用->。實際上在高階語言中已經不區分了,都用.)

(3)結構體的訪問方式有點類似於陣列下標的方式

2.利用指標訪問結構體元素

結構體元素位址=結構體首位址+元素偏移量

struct

mystruct

s1;的位址

int* p=(int*)((int)&s1+4

);*p=5;//

s1.b=5;

3.結構體對齊

一般情況下,為了配合硬體,如果對齊排布和訪問會提高效率,否則會大大降低效率。

(0)、一般編輯器預設4位元組對齊。

(1)、結構體對齊要考慮:結構體整體本身必須安置在4位元組對齊處,結構體對齊後的大小必須4的倍數(編譯器設定為4位元組對齊時,如果編譯器設定為8位元組對齊,則這裡的4是8)

(2)、結構體中每個元素本身都必須對其存放,而每個元素本身都有自己的對齊規則。

(3)、編譯器考慮結構體存放時,以滿足以上2點要求的最少記憶體需要的排布來算。

struct

mystruct1

; struct

mystruct11

;typedef

struct

mystruct111

my111;

typedef

struct

mystruct2

mys2;

struct

mystruct21

;typedef

struct

mystruct5

mys5;

struct

stu;

4.結構體對齊指令

以#prgama pack(n)開頭,以#pragma pack()結尾,定義乙個區間,這個區間內的對齊引數就是n。

#pragma pack(2)

structs ;

#pragma pack()

取消對齊訪問

__attribute__((packed));

設定結構體整體對齊訪問(不包含元素)

__attribute__((aligned(n)));

struct

mystruct11

__attribute__((packed));

typedef

struct

mystruct111

__attribute__((aligned(1024))) my111;

5.offsetof巨集與container_of巨集

offsetof            在0位址處虛擬出乙個結構體,通過元素的位址則為偏移量

container_of     通過元素位址減去偏移量得到結構體位址

typeof()傳入變數,返回相應的資料型別。
#includestruct

mystruct;//

type是結構體型別,member是結構體中乙個元素的元素名

//這個巨集返回的是member元素相對於整個結構體變數的首位址的偏移量,型別是int

#define offsetof(type, member) ((int) &(((type *)0)->member))//

type *為傳入值

//ptr是指向結構體元素member的指標,type是結構體型別,member是結構體中乙個元素的元素名

//這個巨集返回的就是指向整個結構體變數的指標,型別是(type *)

//typeof() 是通過變數名 返回資料型別的

#define container_of(ptr, type, member) () //

元素位址-偏移量=結構體首位址

//通過元素位址減去偏移量得到結構體位址

intmain()

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位機為 ...