位元組對齊的意義

2021-08-02 08:39:25 字數 881 閱讀 6451

一、為什麼需要進行位元組對齊

1、各個硬體平台對儲存空間的處理不盡相同,比如一些cpu訪問特定的變數必須從特定的位址進行讀取,所以在這種架構下就必須進行位元組對齊了,要不然讀取不到資料或者讀取到的資料是錯誤的。

2、會對cpu的訪問效率產生影響:比如有些平台cpu從記憶體中偶數字址開始讀取資料,如果資料起始位址正好為偶數,則1個讀取週期就可以讀出乙個int型別的值,而如果資料其實位址為奇數,那我們就需要2個讀取週期讀出資料,並對高位址和低位址進行拼湊,這在讀取效率上顯然已經落後了很多了。

二、位元組對齊規則

1、資料型別自身對齊值:char型別自身對齊值為1,short對齊值為2,int, float, long對齊值為4,string對齊值為4,double對齊值為8,long double對齊方式為12。

2、指定對齊方式:#pragma pack (value)時指定的對齊value。

3、結構體或者類的對齊方式:其成員中自身對齊值最大的那個值

4、含有指定對齊方式的結構體和類的對齊方式:按照指定對齊方式和結構體或者類成員中自身對齊值最大的那個值。

比如:

#pragma pack (2)

struct temp

;#pragma pack() //恢復對齊狀態

在此我們指定對齊方式為2,而struct預設對齊方式為4,所以對齊方式取二者中的較小者:2。

並且在此a被static 修飾,為靜態變數,其存放位置與結構體或者類的例項無關,所以不對結構體或者類的大小產生任何影響。

在此struct c的大小為14。//sizeof(c) == 14

三、位元組對齊的優勢

位元組對齊可以讓cpu快速取到相應的資料,可以提高程式的效率。

C 中位元組對齊以及位元組對齊的意義

對下面的類 class b 類b 物件的大小,如果直接計算是18 4 2 8 4 但是 sizeof b 結果是24。多出來的 6個位元組是怎麼回事呢?其實是記憶體對齊的原因。編譯器在預設的情況下,分配給各個成員變數的記憶體大小似乎是向佔最大空間的成員變數對齊的 這裡我不敢肯定,還沒看到權威的說法 ...

位元組順序 位元組對齊

一.位元組順序的產生 在計算機中,資料是以位元組為單位存放的,而c語言中只有char才是乙個位元組,其他如int,float都是大於乙個位元組,所以就存在將資料按怎樣的順序存放的問題。一般有大端序和小端序兩種方式,特殊的還有混合序,也就是兩種存放方式同時存在於乙個計算機系統中。上面講的都是主機位元組...

位元組順序 位元組對齊

一.位元組順序的產生 在計算機中,資料是以位元組為單位存放的,而c語言中只有char才是乙個位元組,其他如int,float都是大於乙個位元組,所以就存在將資料按怎樣的順序存放的問題。一般有大端序和小端序兩種方式,特殊的還有混合序,也就是兩種存放方式同時存在於乙個計算機系統中。上面講的都是主機位元組...