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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C/C++字节对齐总结

發(fā)布時間:2024/9/5 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++字节对齐总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  現(xiàn)代計算機中內存空間都是按照byte劃分的,從理論上講似乎對任何類型的變量的訪問可以從任何地址開始,但實際情況是在訪問特定類型變量的時候經常在特定的內存地址訪問,這就需要各種類型數(shù)據(jù)按照一定的規(guī)則在空間上排列,而不是順序的一個接一個的排放,這就是對齊。簡單來說就是犧牲空間來增加訪問效率。

其準則如下:

1)?結構體變量的首地址能夠被其最寬基本類型成員的大小所整除; 2) 結構體每個成員相對于結構體首地址的偏移量都是成員大小的整數(shù)倍,如有需要編譯器會在成員之間加上填充字節(jié); 3) 結構體的總大小為結構體最寬基本類型成員大小的整數(shù)倍,如有需要編譯器會在最末一個成員之后加上填充字節(jié)。

下面來說一說對齊的規(guī)則:

例1:

struct test1
{
int ia;   
double da;  

char ca;
};

  sizeof(test1) = 24

讓我們看看他們在內存上是如何分布的:

?

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

ia

ia

ia

ia

?

?

?

?

da

da

da

da

da

da

da

da

ca

?

?

?

?

?

?

?

?

?

?

?

double類型的da首地址必須為8的倍數(shù),編譯器在ia和da的中間加4個填充字節(jié),結構體的總大小為8的倍數(shù),編譯器在末尾填充7個填充字節(jié)。

  例2:

struct test2
{
short sa;
short sb;
double da;

};

sizeof(test2) = 16

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

sa

sa

sb

sb

?

?

?

?

da

da

da

da

da

da

da

da

ca

?

?

?

?

short sb的對齊值為2,所以可以在3,4位置上。

?

那我們如何能按自己的意愿指定對齊值呢?

使用 #pragma pack(n),編譯器會按n和結構體中最長的成員的長度中較小者為其值。

使用#pragma pack(2)之后 sizeof(test2) = 12,da的首地址為4。

若想在同一文件中使不同結構體按不同值來對齊,還可使用__attribute__ ((__packed__))來為每一個結構體聲明。

?

參考資料:百度百科http://baike.baidu.com/link?url=0JTcfOdOwII5V0F99OTbJnGXaDd6CtrEXy-tJHja3fQ7GmEhQ-4rVRdhhmjZtnUDyIGb7xOwEMjLf-i_BjEoI6Q5YzkCLIS0Ga1MZMDfExdP1-coCojy74OP7deoTovA

轉載于:https://www.cnblogs.com/dk666/p/5969755.html

總結

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

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