C高階 記憶體對齊

2021-10-04 08:15:27 字數 2640 閱讀 4609

看更多乾貨,獲取第一時間更新

我們這一節主要來講一相關的些比較重要的知識。

1. 記憶體對齊

ⅰ)引入

struct s1

;

上面是乙個結構體,也是我們自定義的一種型別。我們知道,任何型別都有大小,那麼結構體 s1 的大小是多少?

是結構體各成員變數大小的和嗎?如果是的話,那結構體 s1 的大小就是 6

那我們設計乙個程式驗證一下:

int

main

(void

)

輸出是:12,這個 12 是怎麼得來的呢?

想要知道這個問題答案,那我們就要了解一下記憶體對齊

ⅱ)為什麼要記憶體對齊?

記憶體對齊關係到 cpu 讀取資料的效率 和 一些其他原因。我們這裡不做展開,有興趣可以自己查一下。

ⅲ)規則

對齊數= 編譯器預設的乙個對齊數 與 該成員大小的較小值

vs中預設的值為8

四)練習

判斷下面結構體的大小:

vs 預設的對齊數是 8,32 位機器

1

struct s1

;

解析:1(char)(+3(int 應該對齊到 4 的整數倍上,也就是 4,所以應該給 1 加上 3 湊成 4)) +4(int)+1(char)(+3最後整個結構體大小為最大對齊數(也就是 4)的整數倍處,所以結構體的大小不是 9 而是 12 )(最大對齊數是最大成員的對齊數,這個是前面算過的(成員大小和預設對齊數取小))

答案:12

2

struct s2

;

第乙個例題已經詳細的分析了判斷結構體大小的步驟,下面不再贅述。

1 (char)+1 (char)(+2) +4 (int)

答案:8

3

struct s3

8 (double)+1 (char)(+3) +4 (int)

答案:16

4

struct s3

;struct s4

;

例 3 中,我們已經知道了 s3 的大小是 16

1 (char)(+7(結構體大小是 16 和 編譯器預設對齊數 8 取較小值,所以結構體要對齊的整數倍是 8)) +16 (s3)+8 (double)

答案:32

不確定你可以自己在你的編譯器上敲一下,看看執行結構,前提是編譯器的預設對齊數是 8 ,如果不是,結果可能會不一樣,那麼編譯器的預設對齊數可以修改嗎?

2. 修改預設對齊數

#pragma pack(4)

//設定預設對齊數為4

如果你想取消設定的預設對齊數,還原為預設:

#pragma pack()
1.了解位段

位段的宣告和結構是類似的,有兩個不同:

位段的成員必須是 int、unsigned int 或signed int 。

位段的成員名後邊有乙個冒號和乙個數字。

struct s

;int

main

(void);

// 可以像一般的結構體成員訪問一樣訪問它們

s.a =-4

;// 3 個位元組儲存數的範圍是 -4 ~ 3

s.b =7;

s.c =3;

s.d =4;

printf

("%d\n"

, s.a)

;return0;

}

儲存方式:

位段的成員可以是 int unsigned int signed int 或者是 char (屬於整形家族)型別

位段的空間上是按照需要以4個位元組( int )或者1個位元組( char )的方式來開闢的。

位段涉及很多不確定因素,位段是不跨平台的,注重可移植的程式應該避免使用位段

位段的應用:

可以自行了解ip資料報格式

在 github 上看更全的目錄:

以後的這個系列的**都會上傳上去,歡迎 star

以上就是本次的內容。

關注我,看更多乾貨!

我是程式圓,我們下次再見。

整數邊界對齊方式 C高階 記憶體對齊

碼字不易,對你有幫助點讚 關注支援一下作者不會程式設計的程式圓看更多乾貨,獲取第一時間更新如果想看比較好看的排版,可以閱讀原文 c高階 四 記憶體對齊 mp.weixin.qq.com 我們這一節主要來講一相關的些比較重要的知識。struct s1 上面是乙個結構體,也是我們自定義的一種型別。我們知...

C 記憶體對齊

vc6.0編譯器對記憶體對齊的管理方式遵循以下兩個原則 1.對於結構體內部變數的對齊方式 變數存放的起始位址相對於結構的起始位址的偏移量 char 偏移量必須為sizeof char 即1的倍數 int 偏移量必須為sizeof int 即4的倍數 float 偏移量必須為sizeof float ...

c 記憶體對齊

一.計算struct的size有兩個原則 pragma pack n n是編譯器的對齊位元組數 1 struct中各成員按照對齊原則 在為當前變數 設為a 分配記憶體時,要參考之前所有變數的偏移量之和 設為d d必須是min n,sizeof a 的倍數,否則編譯器會自動在最後補上缺少的位元組數。2...