位元組對齊的幾個問題

2021-08-02 07:03:05 字數 1341 閱讀 1334

相信大家或多或少都會遇到位元組對齊的情況,然而在不明就裡的情況下,忽視位元組對齊,就會導致資料亂作一團,而不得其解。

這樣的問題同樣困擾過我,是在跨平台資料交換的時候遇到的。當然,同時還可能會有大小端(big_endian and little_endian)問題,在此且不談及。

通過查閱資料,才算略知其一。

預設的位元組對齊不一定適用於我們的應用環境,在這樣的情景之下,我們需要顯示指定位元組對齊方式。方法就是預編譯指令

「#pragma pack(n)」

需要注意的是這條預編譯指令的使用方式,類似於鎖的使用,需要成對使用。 在處理完顯示指定位元組對齊後就要恢復為預設的位元組對齊方式,其指令也是#pragma pack()

例如: 以2位元組對齊為例

#pragma pack(push)

#pragma pack(2)

#pragma pack(pop)

或者,更簡潔一些

#pragma pack(2)

#pragma pack()

另乙個相關的問題時,在考慮位元組對齊時的型別大小

case 1:

#pragma pack(2)

struct a

char c;         // offsetof(a, c) = 0

double d;     // offsetof(a, d) = 2

short s;        // offsetof(a, s) = 10

#pragma pack()

cout << sizeof(a) << endl;      //12

case 2:

case 1:

#pragma pack(16)

struct a

char c;         // offsetof(a, c) = 0

double d;     // offsetof(a, d) = 8

short s;        // offsetof(a, s) = 16

#pragma pack()

cout << sizeof(a) << endl;      //24

結論

#pragma pack(n)來設定變數以n位元組對齊,就是說變數存放的起始位址的偏移量有兩種情況:第

一、如果n大於等於該變數所占用的位元組數,那麼偏移量必須滿足預設的對齊方式,第

二、如果n小於該變數的型別所占用的位元組數,那麼偏移量為n的倍數,不用滿足預設的對齊方式。結構的總大小也有個約束條件,分下面兩種情況:如果n大於所有成員變數型別所占用的位元組數,那麼結構的總大小必須為占用空間最大的變數占用的空間數的倍數; 否則必須為n的倍數。



幾個問題的

1.寫乙個函式返回引數二進位制中 1 的個數 比如 15 0000 1111 4 個 1 程式原型 int count one bits unsigned int value 解 無符號整型為32位,所以利用迴圈32次,逐個判斷二進位制每一位是不是1 int count one bits unsig...

位元組對齊的問題

為了能使cpu對變數進行高效快速的訪問,變數的起始位址應該具有某些特性,即所謂的 對齊 例如對於4位元組的int型別變數,其起始位址應位於4位元組邊界上,即起始位址能夠被4整除。變數的對齊規則如下 32位系統 type alignment char 在位元組邊界上對齊 short 16 bit 在雙...

位元組對齊的問題

位元組對齊的細節和具體編譯器實現相關,表現為具體的彙編翻譯可能會因為編譯器的不同而不同,但一般而言,滿足三個準則 1 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除 2 結構體每個成員相對於結構體首位址的偏移量都是成員大小的整數 倍,如有需要編譯器會在成員之間加上填充位元組 例如上面第二個結...