C/C++字节对齐总结
現(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++字节对齐总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [四校联考P3] 区间颜色众数 (主席
- 下一篇: s3c2440移植MQTT