日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

结构体对齐

發布時間:2025/3/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 结构体对齐 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

結構體對齊

C/C++數據對齊

為了避免混淆,做如下規定,以下代碼若不加特殊說明都運行于32位平臺,結構體的默認對齊值是8,各數據類型所占字節數分別為

char占一個字節

int占四個字節

double占八個字節。

兩個例子

請問下面的結構體大小是多少?

struct Test {char c ;int i ; };

這個呢?

struct Test1 {int i ;double d ;char c ; };

在公布答案之前先看一下對齊的規則。

對齊規則

一般來說,結構體的對齊規則是先按數據類型自身進行對齊,然后再按整個結構體進行對齊,對齊值必須是2的冪,比如1,2, 4, 8, 16。如果一個類型按n字節對齊,那么該類型的變量起始地址必須是n的倍數。比如int按四字節對齊,那么int類型的變量起始地址一定是4的倍數,比如0x0012ff60,0x0012ff48等。

?

數據自身的對齊

數據自身的對齊值通常就是數據類型所占的空間大小,比如int類型占四個字節,那么它的對齊值就是4

整個結構體的對齊

整個結構體的對齊值一般是結構體中最大數據類型所占的空間,比如下面這個結構體的對齊值就是8,因為double類型占8個字節。

struct Test2 {int i ;double d ; };

例子答案

有了上面的基礎,再回過頭去看看一開始的兩個例子

先看結構體Test

1 c是char類型,按1個字節對齊

2 i是int類型,按四個字節對齊,所以在c和i之間實際上空了三個字節。

整個結構體一共是1 + 3(補齊)+ 4 = 8字節。

再看Test1

i是int類型,按4字節對齊

d是double類型,按8字節對齊,所以i和d之間空了4字節

c是char類型,按1字節對齊。

所以整個結構體是 4(i) + 4(補齊)+ 8(d) + 1(c) =? 17字節,注意!還沒完,整個結構體還沒有對齊,因為結構體中空間最大的類型是double,所以整個結構體按8字節對齊,那么最終結果就是17 + 7(補齊) = 24字節。

書寫結構體的建議

我們對Test1做一點改動

struct Test1 {char c ;int i ;double d ; };

這時Test1的大小就變成了16,而不是24了,節省了8個字節!可見結構體中成員的書寫順序對結構體大小的影響還是很大的,一個好的建議是,按照數據類型由小到大的順序進行書寫。http://www.cnblogs.com/graphics/archive/2010/08/12/1797953.html

總結

以上是生活随笔為你收集整理的结构体对齐的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。