C C 中結構體位元組對齊原理

2021-10-06 18:24:54 字數 1343 閱讀 1012

首先看下面定義的結構體所佔空間記憶體的大小是多少呢?

#include using namespace std;

struct student // 定義結構體

stu;

int main()

可能會有人說,1+4 = 5,不就5嗎,然而,實際通過sizeof運算子得到的答案是 8 !!!

為什麼會這樣?通過記憶體空間分配來說明更具有說服性。

char乙個位元組,int是4個位元組,結構體是按照最大的型別作為記憶體對齊的標準,就是4個位元組對齊,因為a後面還剩三個位元組記憶體,不足以存放4個位元組的b,所以需要重新開闢4位元組的記憶體空間存放b。

為了驗證這個原理,我在a和b中間定義乙個char型別變數c,如果分析正確,那麼c應該是緊跟著a後面存放的,因為a後面三個位元組空間足夠存放c。

#include using namespace std;

struct student // 定義結構體

顯然結果是符合我的分析的。記憶體分配圖如下:

結構體所佔記憶體大小仍然為8位元組。

再互換b與c的宣告位置,再看看結果會怎樣?

#include using namespace std;

struct student // 定義結構體

記憶體分配如下:原因很簡單,a後面的三位元組空間不能存放四位元組大小的b,所以b重新開闢4位元組空間,b後面沒有剩餘的空間,所以c需要重新開闢4位元組空間,並且只占用第乙個位元組空間。

所以,為了避免不必要的記憶體開銷,結構體中成員的定義宣告盡量根據型別所佔記憶體大小:從大到小,或者從小到大排列,不要交叉排列,容易造成記憶體浪費。

C C 結構體位元組對齊

注 最近在做uvc描述符的編輯工具,用到很多的結構,為了方便把結構體寫成bin檔案,需要把結構體中填充的位元組去掉,在網上搜尋得到這篇文章,感覺挺好的,轉過來做個紀念。結構體 struct 的sizeof值,並不是簡單的將其中各元素所佔位元組相加,而是要考慮到儲存空間的位元組對齊問題。先看下面定義的...

結構體位元組對齊

include pragma pack 2 struct t.pragma pack int main int argc,char argv 最後輸出的結果為 8。這個表示是按照2位元組來對齊資料,首先分配2位元組給成員變數i,分配完成後,還剩一位元組,zj add補0 沒法容納成員變數d,此時會再...

結構體位元組對齊

include pragma pack 2 struct t.pragma pack int main int argc,char argv 最後輸出的結果為 8。這個表示是按照2位元組來對齊資料,首先分配2位元組給成員變數i,分配完成後,還剩一位元組,zj add補0 沒法容納成員變數d,此時會再...