久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

C++中的內(nèi)存對齊

 My鏡像站 2011-11-16

內(nèi)存對齊

         在我們的程序中,,數(shù)據(jù)結(jié)構(gòu)還有變量等等都需要占有內(nèi)存,在很多系統(tǒng)中,,它都要求內(nèi)存分配的時(shí)候要對齊,,這樣做的好處就是可以提高訪問內(nèi)存的速度。


 我們還是先來看一段簡單的程序:


                                程序一

 1 #include <iostream>
 2 using namespace std;
 3 
 4 struct X1
 5 {
 6   int i;//4個(gè)字節(jié)
 7   char c1;//1個(gè)字節(jié)
 8   char c2;//1個(gè)字節(jié)
 9 };
10 
11 struct X2
12 {
13   char c1;//1個(gè)字節(jié)
14   int i;//4個(gè)字節(jié)
15   char c2;//1個(gè)字節(jié)
16 };
17 
18 struct X3
19 {
20   char c1;//1個(gè)字節(jié)
21   char c2;//1個(gè)字節(jié)
22   int i;//4個(gè)字節(jié)
23 };
24 int main()
25 {   
26     cout<<"long "<<sizeof(long)<<"/n";
27     cout<<"float "<<sizeof(float)<<"/n";
28     cout<<"int "<<sizeof(int)<<"/n";
29     cout<<"char "<<sizeof(char)<<"/n";
30 
31     X1 x1;
32     X2 x2;
33     X3 x3;
34     cout<<"x1 的大小 "<<sizeof(x1)<<"/n";
35     cout<<"x2 的大小 "<<sizeof(x2)<<"/n";
36     cout<<"x3 的大小 "<<sizeof(x3)<<"/n";
37     return 0;
38 }

      
      這段程序的功能很簡單,,就是定義了三個(gè)結(jié)構(gòu)X1,X2,X3,這三個(gè)結(jié)構(gòu)的主要區(qū)別就是內(nèi)存數(shù)據(jù)擺放的順序,其他都是一樣的,,另外程序輸入了幾種基本類型所占用的字節(jié)數(shù),,以及我們這里的三個(gè)結(jié)構(gòu)所占用的字節(jié)數(shù)。

這段程序的運(yùn)行結(jié)果為:

1 long 4
2 float 4
3 int 4
4 char 1
5 x1 的大小 8
6 x2 的大小 12
7 x3 的大小 8


     結(jié)果的前面四行沒有什么問題,,但是我們在最后三行就可以看到三個(gè)結(jié)構(gòu)占用的空間大小不一樣,,造成這個(gè)原因就是內(nèi)部數(shù)據(jù)的擺放順序,怎么會(huì)這樣呢,?

    下面就是我們需要講的內(nèi)存對齊了,。

    內(nèi)存是一個(gè)連續(xù)的塊,我們可以用下面的圖來表示,  它是以4個(gè)字節(jié)對一個(gè)對齊單位的:

                                                    圖一

mem1.jpg

   讓我們看看三個(gè)結(jié)構(gòu)在內(nèi)存中的布局:

   首先是 X1,,如下圖所示

mem2.jpg


    X1 中第一個(gè)是 Int類型,,它占有4字節(jié),所以前面4格就是滿了,,然后第二個(gè)是char類型,,這中類型只占一個(gè)字節(jié),所以它占有了第二個(gè)4字節(jié)組塊中的第一格,,第三個(gè)也 是char類型,,所以它也占用一個(gè)字節(jié),它就排在了第二個(gè)組塊的第二格,,因?yàn)樗鼈兗釉谝黄鸫笮∫膊怀^一個(gè)塊,,所以他們?nèi)齻€(gè)變量在內(nèi)存中的結(jié)構(gòu)就是這樣 的,因?yàn)橛袃?nèi)存分塊對齊,,所以最后出來的結(jié)果是8,,而不是6,因?yàn)楹竺鎯蓚€(gè)格子其實(shí)也算是被用了,。

    再次看看X2,,如圖所示

mem4.jpg

    X2中第一個(gè)類型是Char類型,它占用一個(gè)字節(jié),,所以它首 先排在第一組塊的第一個(gè)格子里面,,第二個(gè)是Int類型,它占用4個(gè)字節(jié),,第一組塊已經(jīng)用掉一格,,還剩3格,,肯定是無法放下第二Int類型的,因?yàn)橐紤]到 對齊,,所以不得不把它放到第二個(gè)組塊,,第三個(gè)類型是Char類型,跟第一個(gè)類似,。所因?yàn)橛袃?nèi)存分塊對齊,,我們的內(nèi)存就不是8個(gè)格子了,而是12個(gè)了,。


再看看X3,,如下圖所示:



mem3.jpg

   關(guān)于X3的說明其實(shí)跟X1是類似的,只不過它把兩個(gè)1個(gè)字節(jié)的放到了前面,,相信看了前面兩種情況的說明這里也是很容易理解的,。


   唉,寫到這手都累了,,關(guān)鍵是要畫圖,,希望通過此文能讓你理解內(nèi)存對齊的基本概念,如果有問題,,請留言,。

此文完

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多