青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

tbwshc

tbw

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  95 Posts :: 8 Stories :: 3 Comments :: 0 Trackbacks

常用鏈接

留言簿(4)

我參與的團(tuán)隊(duì)

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

最近在調(diào)試中遇到點(diǎn)內(nèi)存對(duì)齊的問題,別人問我是怎么回事,我趕緊偷偷查了一下,記錄下來。

不論是C、C++對(duì)于內(nèi)存對(duì)齊的問題在原理上是一致的,對(duì)齊的原因和表現(xiàn),簡(jiǎn)單總結(jié)一下,以便朋友們共享。

一、內(nèi)存對(duì)齊的原因
大部分的參考資料都是如是說的:
1、平臺(tái)原因(移植原因):不是所有的硬件平臺(tái)都能訪問任意地址上的任意數(shù)據(jù)的;某些硬件平臺(tái)只能在某些地址處取某些特定類型的數(shù)據(jù),否則拋出硬件異常。
2、性能原因:數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能地在自然邊界上對(duì)齊。原因在于,為了訪問未對(duì)齊的內(nèi)存,處理器需要作兩次內(nèi)存訪問;而對(duì)齊的內(nèi)存訪問僅需要一次訪問。

   也有的朋友說,內(nèi)存對(duì)齊出于對(duì)讀取的效率和數(shù)據(jù)的安全的考慮,我覺得也有一定的道理。

二、對(duì)齊規(guī)則
    每個(gè)特定平臺(tái)上的編譯器都有自己的默認(rèn)“對(duì)齊系數(shù)”(也叫對(duì)齊模數(shù))。比如32位windows平臺(tái)下,VC默認(rèn)是按照8bytes對(duì)齊的(VC->Project->settings->c/c++->Code Generation中的truct member alignment 值默認(rèn)是8),程序員可以通過預(yù)編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一系數(shù),其中的n就是你要指定的“對(duì)齊系數(shù)”。

    在嵌入式環(huán)境下,對(duì)齊往往與數(shù)據(jù)類型有關(guān),特別是C編譯器對(duì)缺省的結(jié)構(gòu)成員自然對(duì)屆條件為“N字節(jié)對(duì) 齊”,N即該成員數(shù)據(jù)類型的長(zhǎng)度。如int型成員的自然對(duì)界條件為4字節(jié)對(duì)齊,而double類型的結(jié)構(gòu)成員的自然對(duì)界條件為8字節(jié)對(duì)齊。若該成員的起始 偏移不位于該成員的“默認(rèn)自然對(duì)界條件”上,則在前一個(gè)節(jié)面后面添加適當(dāng)個(gè)數(shù)的空字節(jié)。C編譯器缺省的結(jié)構(gòu)整體的自然對(duì)界條件為:該結(jié)構(gòu)所有成員中要求的 最大自然對(duì)界條件。若結(jié)構(gòu)體各成員長(zhǎng)度之和不為“結(jié)構(gòu)整體自然對(duì)界條件的整數(shù)倍,則在最后一個(gè)成員后填充空字節(jié)。

    那么可以得到如下的小結(jié):

類型 對(duì)齊方式(變量存放的起始地址相對(duì)于結(jié)構(gòu)的起始地址的偏移量)
Char    偏移量必須為sizeof(char)即1的倍數(shù)
Short   偏移量必須為sizeof(short)即2的倍數(shù)
int     偏移量必須為sizeof(int)即4的倍數(shù)
float   偏移量必須為sizeof(float)即4的倍數(shù)
double  偏移量必須為sizeof(double)即8的倍數(shù)

   各成員變量在存放的時(shí)候根據(jù)在結(jié)構(gòu)中出現(xiàn)的順序依次申請(qǐng)空間,同時(shí)按照上面的對(duì)齊方式調(diào)整位置,空缺的字節(jié)編譯器會(huì)自動(dòng)填充。同時(shí)為了確保結(jié)構(gòu)的大小為結(jié) 構(gòu)的字節(jié)邊界數(shù)(即該結(jié)構(gòu)中占用最大空間的類型所占用的字節(jié)數(shù))的倍數(shù),所以在為最后一個(gè)成員變量申請(qǐng)空間后,還會(huì)根據(jù)需要自動(dòng)填充空缺的字節(jié),也就是 說:結(jié)構(gòu)體的總大小為結(jié)構(gòu)體最寬基本類型成員大小的整數(shù)倍,如有需要編譯器會(huì)在最末一個(gè)成員之后加上填充字節(jié)。對(duì)于char數(shù)組,字節(jié)寬度仍然認(rèn)為為1。

   對(duì)于下述的一個(gè)結(jié)構(gòu)體,其對(duì)齊方式為:

struct Node1{

    double m1;
    char m2;
    int m3;
};

  對(duì)于第一個(gè)變量m1,sizeof(double)=8個(gè)字節(jié);接下來為第二個(gè)成員m2分配空間,這時(shí)下一個(gè)可以分配的地址對(duì)于結(jié)構(gòu)的起始地址的偏移量為8,是sizeof(char)的倍數(shù),所以把m2存放在偏移量為8的地方滿足對(duì)齊方式,該成員變量占用 sizeof(char)=1個(gè)字節(jié);接下來為第三個(gè)成員m3分配空間,這時(shí)下一個(gè)可以分配的地址對(duì)于結(jié)構(gòu)的起始地址的偏移量為9,不是sizeof (int)=4的倍數(shù),為了滿足對(duì)齊方式對(duì)偏移量的約束問題,自動(dòng)填充3個(gè)字節(jié)(這三個(gè)字節(jié)沒有放什么東西),這時(shí)下一個(gè)可以分配的地址對(duì)于結(jié)構(gòu)的起始地址的偏移量為12,剛好是sizeof(int), 由于8+4+4 = 16恰好是結(jié)構(gòu)體中最大空間類型double(8)的倍數(shù),所以sizeof(Node1) =16.

 

typedef struct{

    char a;

    int b;

    char c;

}Node2;

    成員a占一個(gè)字節(jié),所以a放在了第1位的位置;由于第二個(gè)變量b占4個(gè)字節(jié),為保證起始位置是4(sizeof(b))的倍數(shù),所以需要在a后面填充3個(gè) 字節(jié),也就是b放在了從第5位到第8位的位置,然后就是c放在了9的位置,此時(shí)4+4+1=9。接下來考慮字節(jié)邊界數(shù),9并不是最大空間類型int(4) 的倍數(shù),應(yīng)該取大于9且是4的的最小整數(shù)12,所以sizeof(Node2) = 12.
typedef struct{

    char a;

    char b;

    int c;

}Node3;

   明顯地:sizeof(Node3) = 8

   對(duì)于結(jié)構(gòu)體A中包含結(jié)構(gòu)體B的情況,將結(jié)構(gòu)體A中的結(jié)構(gòu)體成員B中的最寬的數(shù)據(jù)類型作為該結(jié)構(gòu)體成員B的數(shù)據(jù)寬度,同時(shí)結(jié)構(gòu)體成員B必須滿足上述對(duì)齊的規(guī)定。

   要注意在VC中有一個(gè)對(duì)齊系數(shù)的概念,若設(shè)置了對(duì)齊系數(shù),那么上述描述的對(duì)齊方式,則不適合。

   例如:

1字節(jié)對(duì)齊(#pragma pack(1))
輸出結(jié)果:sizeof(struct test_t) = 8 [兩個(gè)編譯器輸出一致]
分析過程:
成員數(shù)據(jù)對(duì)齊
#pragma pack(1)
struct test_t {
    int a;
    char b;
    short c;
    char d;
};
#pragma pack()
成員總大小=8;

 

2字節(jié)對(duì)齊(#pragma pack(2))
輸出結(jié)果:sizeof(struct test_t) = 10 [兩個(gè)編譯器輸出一致]
分析過程:
成員數(shù)據(jù)對(duì)齊
#pragma pack(2)
struct test_t {
    int a;
    char b;
    short c;
    char d;
};
#pragma pack()
成員總大小=9;

 

4字節(jié)對(duì)齊(#pragma pack(4))
輸出結(jié)果:sizeof(struct test_t) = 12 [兩個(gè)編譯器輸出一致]
分析過程:
1) 成員數(shù)據(jù)對(duì)齊
#pragma pack(4)
struct test_t { //按幾對(duì)齊, 偏移量為后邊第一個(gè)取模為零的。
int a;
char b;
short c;
char d;
};
#pragma pack()
成員總大小=9;

 

8字節(jié)對(duì)齊(#pragma pack(8))
輸出結(jié)果:sizeof(struct test_t) = 12 [兩個(gè)編譯器輸出一致]
分析過程:
成員數(shù)據(jù)對(duì)齊
#pragma pack(8)
struct test_t {
int a;
char b;
short c;
char d;
};
#pragma pack()
成員總大小=9;

 

16字節(jié)對(duì)齊(#pragma pack(16))
輸出結(jié)果:sizeof(struct test_t) = 12 [兩個(gè)編譯器輸出一致]
分析過程:
1) 成員數(shù)據(jù)對(duì)齊
#pragma pack(16)
struct test_t {
int a;
char b;
short c;
char d;
};
#pragma pack()
成員總大小=9;

 

至于8字節(jié)對(duì)齊和16字節(jié)對(duì)齊,我覺得這兩個(gè)例子取得不好,沒有太大的參考意義。

(x666f)

posted on 2013-07-10 17:09 tbwshc 閱讀(268) 評(píng)論(0)  編輯 收藏 引用

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩亚洲高清| 久久野战av| 亚洲高清在线播放| 欧美电影在线观看| 亚洲免费综合| 久久伊人亚洲| 亚洲免费小视频| 亚久久调教视频| 亚洲国产欧美一区二区三区同亚洲| 国产精品观看| 国产精品一区二区三区乱码| 欧美二区视频| 欧美精品免费看| 欧美激情亚洲国产| 欧美精品免费在线观看| 欧美另类综合| 国产精品一区一区| 久久伊人一区二区| 免费在线观看一区二区| 欧美日韩精品福利| 国产亚洲网站| 亚洲综合成人在线| 亚洲第一黄网| 亚洲全黄一级网站| 亚洲愉拍自拍另类高清精品| 一区二区三区成人精品| 一区二区三区欧美| 久久人人爽人人爽| 亚洲欧洲精品成人久久奇米网 | 亚洲精品精选| 欧美高清视频在线| 99re66热这里只有精品4| 久久裸体视频| av不卡在线| 亚洲二区免费| 久久综合狠狠综合久久综合88| 欧美激情91| 亚洲欧洲中文日韩久久av乱码| 亚洲欧美一区二区在线观看| 亚洲级视频在线观看免费1级| 欧美诱惑福利视频| 国产视频一区欧美| 欧美一区二区视频在线观看| 亚洲理伦在线| 夜夜爽av福利精品导航 | 亚洲国产一区二区三区a毛片 | 久久久青草青青国产亚洲免观| 欧美日韩免费看| 91久久中文| 99视频精品免费观看| 欧美国产成人精品| 日韩一二三区视频| 亚洲国产精品久久久久婷婷884| 久久精品国产亚洲精品| 亚洲嫩草精品久久| 亚洲网站视频福利| 极品尤物av久久免费看| 亚洲黄页视频免费观看| 欧美一区二区三区免费视频| 久久久久久久999| 免费成人激情视频| 香蕉av777xxx色综合一区| 欧美一级视频| 一本大道久久a久久精二百| 亚洲视频在线观看三级| 尤物九九久久国产精品的特点 | 亚洲黄色av| 在线亚洲成人| 亚洲国产精品一区制服丝袜 | 99热免费精品| 亚洲精品一区二区三| 欧美亚洲在线视频| 欧美日韩高清在线| 免费欧美日韩| 黑人巨大精品欧美一区二区小视频| 最新成人在线| 亚洲青涩在线| 你懂的国产精品| 另类图片国产| 悠悠资源网久久精品| 亚洲美女视频| 久久裸体艺术| 久久久综合网| 亚洲在线免费视频| 在线亚洲伦理| 欧美va天堂| 国产精品福利影院| 一区二区三区欧美亚洲| 午夜欧美大片免费观看| 国产日韩三区| 欧美激情第9页| 亚洲男人的天堂在线| 老牛国产精品一区的观看方式| 国模私拍一区二区三区| 久久久久国产精品人| 亚洲国产日韩一区| 国产精品久久久久久久免费软件| 亚洲小说欧美另类婷婷| 美女黄色成人网| 国产精品99久久99久久久二8 | 99re亚洲国产精品| 亚洲欧洲日本mm| 欧美色综合网| 久久一区免费| 9国产精品视频| 亚洲第一精品影视| 欧美一区二视频在线免费观看| 欧美日韩精品二区第二页| 欧美一区久久| 一区二区三区视频观看| 国产真实乱偷精品视频免| 欧美日韩精品欧美日韩精品| 亚洲欧美综合| 在线激情影院一区| 久久久久在线| 欧美一区二区在线观看| 一区二区三区欧美在线观看| 久久婷婷久久一区二区三区| 欧美一级艳片视频免费观看| 91久久久在线| 欧美二区不卡| 久久综合久久综合九色| 亚洲黄色免费网站| 99国内精品久久| 亚洲电影毛片| 亚洲一区欧美激情| 欧美一区免费视频| 亚洲一区二区av电影| 欧美1区视频| 久久综合福利| 国产精品久久久久久久久久免费| 久久久综合免费视频| 亚洲一区二区三区在线| 亚洲欧美日韩在线不卡| 在线亚洲精品| 欧美激情va永久在线播放| 国内视频精品| 欧美在线视频一区二区三区| 亚洲视频在线观看三级| 欧美日本中文| 亚洲国产精品悠悠久久琪琪| 国产综合香蕉五月婷在线| 欧美国产日韩精品| 红桃视频亚洲| 午夜精品免费在线| 午夜一区在线| 国产精品白丝av嫩草影院| 亚洲免费观看| 欧美日韩另类一区| 99综合视频| 亚洲午夜高清视频| 欧美日韩伊人| 一区二区三区精品久久久| 亚洲美女色禁图| 欧美日韩1080p| 国内精品久久久久久久97牛牛| 久久精品中文字幕一区| 国产精品手机在线| 欧美亚洲一级片| 久久综合色播五月| 在线免费一区三区| 欧美成人免费在线| 欧美高清在线视频| 日韩视频不卡| 欧美日韩二区三区| 中国成人在线视频| 亚洲欧美一区二区三区久久| 欧美激情中文不卡| 亚洲视频网站在线观看| 午夜精品免费| 国内精品视频在线观看| 美女网站久久| 一本色道久久综合亚洲精品按摩 | 一区二区三区四区蜜桃| 亚洲视频一区在线| 狂野欧美一区| 亚洲影院免费观看| 伊人久久大香线| 欧美在线一区二区| 国产精品高潮呻吟| 日韩午夜免费| 久热精品视频在线免费观看| 亚洲国产天堂久久国产91| 欧美新色视频| 久久香蕉精品| 在线综合欧美| 亚洲福利国产| 欧美一区二视频在线免费观看| 亚洲国产精品小视频| 国产日韩欧美制服另类| 欧美成年人网| 久久精品中文| 中文在线一区| 18成人免费观看视频| 国产精品伦子伦免费视频| 久热爱精品视频线路一| 一本色道久久综合狠狠躁篇的优点| 两个人的视频www国产精品| 欧美亚洲网站| 久久看片网站|