C/C++字节对齐总结
現(xiàn)代計(jì)算機(jī)中內(nèi)存空間都是按照byte劃分的,從理論上講似乎對(duì)任何類型的變量的訪問可以從任何地址開始,但實(shí)際情況是在訪問特定類型變量的時(shí)候經(jīng)常在特定的內(nèi)存地址訪問,這就需要各種類型數(shù)據(jù)按照一定的規(guī)則在空間上排列,而不是順序的一個(gè)接一個(gè)的排放,這就是對(duì)齊。簡(jiǎn)單來說就是犧牲空間來增加訪問效率。
其準(zhǔn)則如下:
1)?結(jié)構(gòu)體變量的首地址能夠被其最寬基本類型成員的大小所整除; 2) 結(jié)構(gòu)體每個(gè)成員相對(duì)于結(jié)構(gòu)體首地址的偏移量都是成員大小的整數(shù)倍,如有需要編譯器會(huì)在成員之間加上填充字節(jié); 3) 結(jié)構(gòu)體的總大小為結(jié)構(gòu)體最寬基本類型成員大小的整數(shù)倍,如有需要編譯器會(huì)在最末一個(gè)成員之后加上填充字節(jié)。下面來說一說對(duì)齊的規(guī)則:
例1:
struct test1
{
int ia;
double da;
char ca;
};
sizeof(test1) = 24
讓我們看看他們?cè)趦?nèi)存上是如何分布的:
?
| 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個(gè)填充字節(jié),結(jié)構(gòu)體的總大小為8的倍數(shù),編譯器在末尾填充7個(gè)填充字節(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的對(duì)齊值為2,所以可以在3,4位置上。
?
那我們?nèi)绾文馨醋约旱囊庠钢付▽?duì)齊值呢?
使用 #pragma pack(n),編譯器會(huì)按n和結(jié)構(gòu)體中最長(zhǎng)的成員的長(zhǎng)度中較小者為其值。
使用#pragma pack(2)之后 sizeof(test2) = 12,da的首地址為4。
若想在同一文件中使不同結(jié)構(gòu)體按不同值來對(duì)齊,還可使用__attribute__ ((__packed__))來為每一個(gè)結(jié)構(gòu)體聲明。
?
參考資料:百度百科http://baike.baidu.com/link?url=0JTcfOdOwII5V0F99OTbJnGXaDd6CtrEXy-tJHja3fQ7GmEhQ-4rVRdhhmjZtnUDyIGb7xOwEMjLf-i_BjEoI6Q5YzkCLIS0Ga1MZMDfExdP1-coCojy74OP7deoTovA
轉(zhuǎn)載于:https://www.cnblogs.com/dk666/p/5969755.html
總結(jié)
以上是生活随笔為你收集整理的C/C++字节对齐总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [四校联考P3] 区间颜色众数 (主席
- 下一篇: 常用的MySQL图形化管理软件