結構體與記憶體對齊

2021-08-15 15:22:09 字數 1137 閱讀 6292

三結構體

1.結構體是一種自定義型別

原生型別 自定義型別

2.結構體使用時先定義結構體型別再定義變數

或者同時定義

struct student{};struct student s1;

struct student{} s1;

typedef struct student{} s1; s1 s;

3.結構體從陣列進步而來

陣列有兩個明顯的缺陷:固定長度 型別相同

4.結構體訪問方式

使用->或者 . c語言規定用結構體變數訪問使用 . 點號 使用結構體指標使用->訪問

訪問實質還是使用指標來訪問

結構體對齊訪問

為什麼要對齊訪問 :主要是為了配合硬體 硬體本身存在物理限制

如果記憶體按照4個位元組讀取讀取效率最高

對齊訪問用空間換時間

整個結構體整體的大小必須是8的倍數 

結構題每個元素都必須滿足自己自身的對齊

在滿足上面兩條條件按記憶體最小對齊

對齊位置有前後兩個元素共同影響 前乙個元素影響開始位址 後乙個元素影響結束位址

如struct s;

a的起始位置為4的倍數,且停止位置為4的倍數,則b可以直接按a的停止位置為起始位置,結束位置受c影響,c佔2個自己,則c的起始位置要是2的倍數,則b需要乙個位來對齊,則b佔兩個位元組,此時c的起始位置為b的結束位置+一位補充,結束位置需要按照結構體整體為4的倍數

記憶體對齊指令#pragma pack()#pragma pack(n) (n=1/2/4/8)

32位編譯器,預設對齊方式為4位元組對齊

#pragma用來設定編碼器的對齊方式

#pragma pack() 設定編譯器1位元組對齊 

#pragma pack(n) (n=1/2/4/8)設定編譯器n位元組對齊

以#pragma pack(n)開頭以#pragma pack() 結尾 在這兩語句中間的以n位元組對齊

struct s__attribute__((packet)); __attribute__((packet)) 設定編譯器1位元組對齊 

struct s__attribute__((aligned(n))); __attribute__((aligned(n))) 讓結構體整體按n對齊 不是各個元素按n對齊

結構體對齊(記憶體對齊

有的時候,在腦海中停頓了很久的 顯而易見 的東西,其實根本上就是錯誤的。就拿下面的問題來看 structt 使用sizeof t 將得到什麼樣的答案呢?要是以前,想都不用想,在32位機中,int是4個位元組,char是1個位元組,所以t一共是5個位元組。實踐出真知,在vc6中測試了下,答案確實8個位...

記憶體對齊 結構體對齊

現在已知32位機器上各種資料型別的長度如下 char 1 有符號無符號同 short 2 有符號無符號同 int 4 有符號無符號同 long 4 有符號無符號同 float 4 double 8 重要規則 1,複雜型別中各個成員按照它們被宣告的順序在記憶體中順序儲存,第乙個成員的位址和整個型別的位...

結構體的大小與記憶體對齊

結構體的大小不是結構體元素單純相加就行的,因為我們現在主流的計算機使用的都是32bit 字長的cpu,對這型別的cpu取4個 位元組的數要比取乙個位元組要高效,也更方便。所以在結構體中每個成員的首位址都是4的整數倍的話,取資料元素時就會相對更高效,這就是記憶體對齊的由來。每個特定平台上的 編譯器都有...