位元組對齊總結

2021-08-26 15:12:18 字數 1818 閱讀 3587

寫在前面

位元組對其是面試筆試當中出現頻率算是比較高的乙個知識點。

在此總結一下。

主要內容
例題:

#pragma pack(2)

class bu

ubuf;

void foo(){}

typedef char*(*f)(void*);

enum

disk;

}bu;

問 : sizeof(bu)的值是()。

首先先不急著回答上面的問題如果你不知道位元組對其以及#pragma pack(2)命令的意思的話先往下看你就知道了。

為什麼要位元組對其

為什麼呢?簡單點說:為了提高訪問效率。位元組是記憶體空間分配的最小單位, 在程式中,我們定義的變數可以放在任何位置。其實不同架構 的cpu在訪問特定型別變數時是有規律的,比如有的cpu訪問int型變數時,會從偶數字址開始讀取的,int型別占用4個位元組(windows平台)。 0x0000,0x0004,0x0008…..這樣只需要讀一次就可以讀出int型別變數的值。相反地,則需要讀取二次,再把高低位元組相拼才能得到 int型別的值,這樣子看的話,訪問效率當然提高了。  通常寫程式的時候,不需要考慮這些情況,編譯都會為我們考慮這些情況,除非針對那些特別架構的 cpu程式設計的時候的則需要考慮 。當然使用者也可以手工控制對齊方式。

就是說平時我們程式設計其實是不用去注意這些東西的,編譯器會為我們考慮好這些和硬體相關的東西。但是作為理解還是很有必要的。

編譯器對位元組對齊的一些規則

就是說:內建資料型別有自己的對其位元組數,類或者結構體或者union的對其數是按照其最大的成員的對其位元組數當做位元組對其位元組數。如果有指定對其的位元組數的時候,實際額的有效對齊數是自身的對齊數和指定的對齊數的較小值。成員當中每個成員的首位址對於其有效對齊位元組數取餘需要為0如果不為0則就需要補齊一些位元組數。類或者結構體或者union的總的大小需要數其有效對齊位元組數的整數倍如果不是就需要補齊

struct b

上面這個結構體的大小在沒有任何指定的情況下是12。

當指定了對齊的位元組數的情況下問題就不一樣了:

#pragma pack(2)

struct c

;

因為指定了對齊的位元組數為2。所以原本int b的對齊位元組數為4現在為2,原本struct c的對齊位元組數為4現在為2。

所以最終結構體的大小為8。

union的情況

而分配給union的實際大小不僅要滿足是對齊大小的整數倍,同時要滿足實際大小不能小於最大成員的大小

所以只需要看union當中最大的那個成員的大小加上對齊大小即可。

#pragma pack(2)

class bu

ubuf;

void foo(){}

typedef char*(*f)(void*);

enum

disk;

}bu;

最後上面這道題目我們可以看出是2位元組對其。其中的函式和巢狀型別的定義是不佔任何的空間的。列舉型別disk的大小是乙個整型變數的大小所以整個大小是22。

位元組對齊總結

1.位元組對齊的緣由?一句話說就是提高訪問效率,訪問效率與機器相關,比如有的機器總是從偶數位元組開始取資料 同時,訪問效率也和資料型別相關,比如如果取乙個整型數字時,若能夠一次取出來肯定是最好,但是若由於機器取資料總是從偶數位元組開始這個原因花了兩次訪問,那麼肯定會降低效率了。2.字元對齊中的一些概...

位元組對齊問題總結

便於cpu快速訪問,減少cpu訪存的次數。對於不同硬體平台下 的移植尤為重要。位元組對齊的目標是 讓變數的起始位址符合某種 特性 比如在32位系統中int變數佔4個位元組,分配記憶體時,其起始位址應該位於4位元組的邊界上,即起始位址能夠被4整除。編譯器缺省會自動為變數對齊,在x86平台上,gcc缺省...

記憶體位元組對齊總結

一 記憶體對齊的原因 大部分的參考資料都是如是說的 1 平台原因 移植原因 不是所有的硬體平台都能訪問任意位址上的任意資料的 某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。2 效能原因 資料結構 尤其是棧 應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需...