經典C語言面試題4 位元組對齊的作用

2021-08-19 03:47:36 字數 2202 閱讀 3884

一、什麼是位元組對齊?

在現代計算機中,記憶體空間都是按照字

節(byte)

劃分的。從理論上講對任何型別的變數的訪問可以從任何位址開始,但實際情況是,訪問特定型別的變數的時候經常在特定的記憶體位址訪問,這就需要各種型別的資料按照一定規則在空間上排列,而不是順序地乙個接乙個地排放,這種所謂的規則就是位元組對齊。這麼長一段話的意思是說:

位元組對齊可以提公升訪問效率,也就是用空間換時間。

例如:

struct a

二、為什麼需要位元組對齊?因為各個硬體平台對儲存空間的處理上有很大的不同,一些平台對某些特定型別的資料只能從某些特定位址開始訪問。比如有些架構的cpu在訪問乙個沒有進行對齊的變數的時候會發生錯誤,那麼在這種架構下程式設計必須保證位元組對齊.其他平台可能沒有這種情況,但是最常見的是如果不按照適合其平台要求對資料存放進行對齊,會在訪問效率上帶來損失。比如有些平台每次讀都是從偶位址開始,如果乙個int型(假設為32位系統)如果存放在偶位址開始的地方,那麼乙個讀週期就可以讀出這32bit,而如果存放在奇位址開始的地方,就需要2個讀週期,並對兩次讀出的結果的高低位元組進行拼湊才能得到該32bit資料。顯然在讀取效率上下降很多。

三、幾個基本概念

1、基本資料型別的自身對齊值

例如,char型資料的自身對齊值為1位元組,short型別自身對齊值為2位元組,int、float、long型別自身對齊值均為4位元組,double

型別自身對齊值均為8位元組。(32位系統)

2、結構體或類的自身對齊值

其成員中自身對齊值最大的那個值。

3、指定對齊值

通過預編譯指令 #pragma pack (value) 來指定的對齊值value。(注:取消自定義對齊值得指令為 #pragma pack ( ))

4、資料成員、結構體和類的有效對齊值

其自身對齊值和指定對齊值中較小的那個值。

四、位元組對齊的幾個例子**

例1:設有如下兩個結構體

struct a

;

struct b

;

那麼上面兩個結構體的大小是多少呢?

對於結構體a:a是char型資料,占用1位元組記憶體;short型資料,占用2位元組記憶體;int型資料,占用4位元組記憶體。因此,結構體a的自身對齊值為4,sizeof(struct a) =8位元組。由於結構體型別資料是按順序儲存結構乙個接乙個向後排列的,於是其儲存方式為:

為了更加明顯地表示「對齊」,我們可以將以上結構想象為以下的行排列:

對於結構體b:同理也是4位元組對齊,但是sizeof(struct b) =12位元組。

想象為以下的行排列:

例2:為結構體指定對齊值

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

struct c

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

對於結構體c:由於其自身對齊值為4位元組(int b),而指定對齊值為2位元組,因此該結構體的有效對齊值為較小的2位元組,那麼sizeof(struct c) = 8 位元組。

#pragma pack(1) //指定1位元組對齊

struct d

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

對於結構體d:同理可知,由於其自身對齊值為4位元組(int b),而指定對齊值為1位元組,因此該結構體的有效對齊值為較小的1位元組,那麼sizeof(struct d) = 7 位元組。

五、總結

由以上分析可知,位元組對齊會造成空間上的浪費。 事實上,除了結構體之外,整個程式在給每個變數進行記憶體分配時都會遵循對齊機制,也都會產生記憶體空間的浪費。但我們要知道,這種浪費是值得的,因為它換來的是效率的提高。

經典C語言面試題

1.gets 函式 問 請找出下面 裡的問題 include intmain void 答 上面 裡的問題在於函式gets 的使用,這個函式從stdin接收乙個字串而不檢查它所複製的快取的容積,這可能會導致快取溢位。這裡推薦使用標準函式fgets 代替。2.strcpy 函式 問 下面是乙個簡單的密...

C語言經典面試題

題目 零值比較 bool,int,float,指標變數與零值比較的if語句。1 int型變數 n 與 零值 比較的 if 語句就是 if n 0 if n 0 如下寫法均屬不良風格.if n 會讓人誤解 n 是布林變數 if n 2 請寫出bool flag與 零值 比較的if語句 if flag ...

經典的c 面試題

1.介紹一下stl,詳細說明stl如何實現vector。answer stl 標準模版庫,standard template library.它由容器演算法迭代器組成。stl有以下的一些優點 可以方便容易地實現搜尋資料或對資料排序等一系列的演算法 除錯程式時更加安全和方便 即使是人們用stl在uni...