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

tbwshc

tbw

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

常用鏈接

留言簿(4)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

最近在調試中遇到點內存對齊的問題,別人問我是怎么回事,我趕緊偷偷查了一下,記錄下來。

不論是C、C++對于內存對齊的問題在原理上是一致的,對齊的原因和表現,簡單總結一下,以便朋友們共享。

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

   也有的朋友說,內存對齊出于對讀取的效率和數據的安全的考慮,我覺得也有一定的道理。

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

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

    那么可以得到如下的小結:

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

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

   對于下述的一個結構體,其對齊方式為:

struct Node1{

    double m1;
    char m2;
    int m3;
};

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

 

typedef struct{

    char a;

    int b;

    char c;

}Node2;

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

    char a;

    char b;

    int c;

}Node3;

   明顯地:sizeof(Node3) = 8

   對于結構體A中包含結構體B的情況,將結構體A中的結構體成員B中的最寬的數據類型作為該結構體成員B的數據寬度,同時結構體成員B必須滿足上述對齊的規定。

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

   例如:

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

 

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

 

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

 

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

 

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

 

至于8字節對齊和16字節對齊,我覺得這兩個例子取得不好,沒有太大的參考意義。

(x666f)

posted on 2013-07-10 17:09 tbwshc 閱讀(268) 評論(0)  編輯 收藏 引用
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲自拍偷拍麻豆| 久久精品国产69国产精品亚洲| 欧美+日本+国产+在线a∨观看| 香蕉亚洲视频| 久久国产精品色婷婷| 午夜精品久久久久久久久久久久久 | 亚洲精品看片| 亚洲日本中文字幕| 日韩视频免费在线观看| 亚洲一区二区在线免费观看视频| 午夜精品影院| 狂野欧美激情性xxxx欧美| 免费在线看一区| 99这里只有精品| 欧美一级黄色网| 欧美夫妇交换俱乐部在线观看| 欧美日韩免费观看一区=区三区| 国产精品免费一区二区三区观看| 黄色成人片子| 国产精品99久久久久久久vr| 久久精品国产清高在天天线| 男女精品视频| 亚洲一区二区三区精品在线| 久久夜色精品国产欧美乱极品| 欧美日韩在线播放一区二区| 国内一区二区三区在线视频| 99精品国产在热久久婷婷| 久久久福利视频| 国产一区二区三区免费不卡| 欧美影片第一页| 欧美国产一区在线| 国产一区二区高清不卡| 一本色道久久99精品综合| 久久精品日韩| 一区二区毛片| 欧美激情一区二区三区高清视频 | 亚洲人成在线播放网站岛国| 亚洲美女av网站| 久久久噜噜噜久久人人看| 久久天堂av综合合色| 91久久在线视频| 午夜精品在线看| 欧美精品成人在线| 伊人狠狠色j香婷婷综合| 亚洲精品激情| 久久精品最新地址| 亚洲精品久久久久久久久久久| 日韩视频免费观看高清在线视频| 欧美亚洲综合在线| 性欧美大战久久久久久久免费观看| 免费亚洲一区二区| 亚洲欧美在线播放| 欧美图区在线视频| 一区二区三区视频在线看 | 美女网站在线免费欧美精品| 亚洲美女精品成人在线视频| 欧美成人精品高清在线播放| 国产一区视频在线观看免费| 欧美一区二区高清在线观看| 中文日韩在线视频| 国产精品va在线播放| 中文国产成人精品| 一区二区三区欧美视频| 欧美午夜大胆人体| 翔田千里一区二区| 欧美一区二区三区精品电影| 国产日韩欧美三级| 久久久久久一区二区| 久久福利资源站| 亚洲第一福利视频| 欧美激情四色| 欧美日韩国产限制| 香蕉久久一区二区不卡无毒影院 | 欧美午夜一区| 亚洲香蕉在线观看| 在线亚洲精品| 国产欧美一区二区精品忘忧草 | 99国内精品久久| 国产精品久久久久久久久免费桃花| 国产一区欧美| 久久久久久久欧美精品| 日韩网站在线观看| 午夜久久久久久| 亚洲一区二区三区高清 | 久久精品国产精品亚洲| 在线精品国产欧美| 亚洲一级二级| 国产精品对白刺激久久久| 亚洲一级黄色片| 欧美一区二区三区久久精品 | 老司机午夜精品| 中日韩美女免费视频网址在线观看 | 亚洲日本一区二区| 在线中文字幕不卡| 国产一区二区三区av电影| 久久网站热最新地址| 欧美精品在欧美一区二区少妇| 欧美一级欧美一级在线播放| 久久综合网络一区二区| 亚洲免费婷婷| 牛牛影视久久网| 久久精选视频| 欧美午夜精品久久久久久超碰| 久久久亚洲国产天美传媒修理工 | 国产精品久久久久久久久久ktv | 美女久久网站| 国产日韩精品入口| 亚洲一区影音先锋| 亚洲国产成人精品久久久国产成人一区| 亚洲国产精品久久91精品| 国产精品成人免费精品自在线观看| 麻豆精品视频在线观看| 欧美亚洲一区| 国内精品模特av私拍在线观看| 久久精品国产成人| 亚洲大片av| 亚洲欧美日韩一区二区三区在线观看 | 麻豆成人在线播放| 亚洲日本欧美| 亚洲国产视频直播| 亚洲性线免费观看视频成熟| 亚洲国产精品久久久久| 亚洲欧美日韩在线不卡| 一区二区三区国产在线观看| 麻豆91精品| 欧美成人黑人xx视频免费观看| 国产精品人成在线观看免费| 亚洲精品美女在线观看| 亚洲大片在线| 久久网站免费| 久热re这里精品视频在线6| 国产精品亚洲一区| 亚洲性线免费观看视频成熟| 夜夜夜久久久| 欧美日韩另类一区| 99re热精品| 亚洲欧美日韩国产中文| 欧美日韩在线免费观看| 亚洲美女中出| 亚洲免费视频一区二区| 国产精品午夜av在线| 性久久久久久久久久久久| 久久精品视频在线观看| 国产在线精品二区| 久久久久99| 欧美激情91| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲视频电影在线| 午夜激情综合网| 国产色综合网| 久久久久久有精品国产| 牛人盗摄一区二区三区视频| 亚洲国产精品一区二区第四页av| 麻豆精品91| 亚洲美女淫视频| 欧美一二三视频| 伊人成年综合电影网| 欧美成年人网| 亚洲色在线视频| 久久免费少妇高潮久久精品99| 亚洲综合大片69999| 欧美在线一二三区| 日韩视频精品在线观看| 欧美日韩免费精品| 亚洲欧美一区二区三区久久 | 欧美另类极品videosbest最新版本| 最新高清无码专区| 性一交一乱一区二区洋洋av| 红桃视频一区| 欧美日韩一区在线播放| 欧美资源在线| 亚洲日本国产| 久久久久久久波多野高潮日日| 亚洲激情在线激情| 国产精品日本| 欧美激情一区二区久久久| 午夜精品成人在线视频| 亚洲国产精品va在线观看黑人| 亚洲欧美中日韩| 亚洲精品欧美精品| 国产视频一区在线观看一区免费 | 久久久久久久久久久久久女国产乱| 欧美国产一区二区在线观看 | 久久久久久国产精品mv| 一二三区精品| 亚洲第一视频网站| 国产精品久久久免费| 欧美承认网站| 久久久噜噜噜| 久久国产加勒比精品无码| 一本色道久久88综合亚洲精品ⅰ| 美女黄网久久| 久久久国产视频91| 亚洲欧美一区二区三区久久| 亚洲国产精品一区| 国外成人在线视频网站| 国产欧美一区二区色老头| 欧美日韩亚洲视频| 欧美区在线播放| 欧美激情精品久久久久久大尺度 |