久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5724|回復: 0
打印 上一主題 下一主題
收起左側

C語言中的結構體數(shù)據(jù)存儲-對齊規(guī)則

[復制鏈接]
跳轉到指定樓層
樓主
ID:104835 發(fā)表于 2016-2-1 02:23 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
 

  (1)什么是字節(jié)對齊

  一個變量占用 個字節(jié),則該變量的起始地址必須能夠被 整除,即每個變量的起始存放地址 % n = 0, 
    對于結構體,這個 
取其成員種的數(shù)據(jù)類型占空間的值最大的那個。

    即:A1存儲地址addr1%A1對齊值=0,A2按順序后延,如果下一個地址addr2%A2!=0就補空,后移存儲地址addr3。若addr3%A2!=0,繼續(xù)后移。
    同時,每個內存塊為最大的對齊值N,不滿的要補空。
   
    結構體中有結構體,把內中的結構體拆開看。 

  (2)為什么要字節(jié)對齊

  內存空間是按照字節(jié)來劃分的,從理論上說對內存空間的訪問可以從任何地址開始,但是在實際上不同架構的CPU為了提高訪問內存的速度,就規(guī)定了對于某些類型的數(shù)據(jù)只能從特定的起始位置開始訪問。這樣就決定了各種數(shù)據(jù)類型只能按照相應的規(guī)則在內存空間中存放,而不能一個接一個的順序排列。

  舉個例子,比如有些平臺訪問內存地址都從偶數(shù)地址開始,對于一個int(假設32位系統(tǒng)),如果從偶數(shù)地址開始的地方存放,這樣一個讀周期就可以讀出這個int數(shù)據(jù),但是如果從奇數(shù)地址開始的地址存放,就需要兩個讀周期,并對兩次讀出的結果的高低字節(jié)進行拼湊才能得到這個int數(shù)據(jù),這樣明顯降低了讀取的效率。

  (3)如何進行字節(jié)對齊

  每個成員按其類型的對齊參數(shù)(通常是這個類型的大小)和指定對齊參數(shù)(不指定則取默認值)中較小的一個對齊,并且結構的長度必須為所用過的所有對齊參數(shù)的整數(shù)倍,不夠就補空字節(jié)。

  這個規(guī)則有點苦澀,可以把這個規(guī)則分解一下,前半句的意思先獲得對齊值后與指定對齊值進行比較,其中對齊值獲得方式如下:

  1. 數(shù)據(jù)類型的自身對齊值為:對于char型數(shù)據(jù),其自身對齊值為1,對于short型為2,對于int, long, float類型,其自身對齊值為4,對于 double 類型其自身對齊值為8,單位為字節(jié)。

  2.結構體自身對齊值:其成員中自身對齊值最大的那個值。

  其中指定對齊值獲得方式如下:

  #pragma pack (value)時的指定對齊值value

  未指定則取默認值。

  后半句的意思是主要是針對于結構體的長度而言,對于結構體,它可能使用了多種數(shù)據(jù)類型,那么這句話翻譯成對齊規(guī)則: 每個成員的起始地址 自身對齊值 = 0,如果不等于 則地址后移直到符合規(guī)則,前面的補空達到對齊值。

  換句話說,對于結構體而言,結構體在在內存的存放順序用如下規(guī)則即可映射出來:

  ()單獨的每個成員的起始地址 每個成員的自身對齊值 = 0,如果不等于 0 就后移,前面補空使得每個成員內存塊為結構體中最大的對齊值。

  ()結構體的長度必須為結構體的自身對齊值的整數(shù)倍,不夠就補空字節(jié)。
舉例:
 typedef struct
{
 char aa;
 short ab;
 char ac;
 long ad;
}A;
sizeof(A) 結果為: 12 內存位置為: $*$$  $***  $$$$ 注意:每個成員首地址必須為自身對齊值的整數(shù)倍。
 

typedef struct
{
 long ba;
 short bb;
 long bc;
 char bd;
 short be;
}B;
sizeof(B)結果為:16  內存位置為:$$$$ $$** $$$$ $*$$   

typedef struct
{
 char ca;
 char cb;
 short cc;
 char cd;
 short ce;
 A cf; 
 char cg;
 short ch;
 long ci;

}C;
sizeof(C)結果為:28  內存位置為:$$$$ $*$$ $*$$ $*** $$$$ $*$$ $$$$

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關帖子

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 五月天激情综合网 | 91av免费在线观看 | 免费精品视频 | 日本国产视频 | 成人精品免费视频 | 精品日韩在线 | 国产亚洲欧美日韩高清 | 国产超碰人人模人人爽人人添 | 一区二区精品在线 | 伊人黄色| 午夜精品久久久久久久久久久久 | 黄色国产 | 亚洲专区在线 | 精品国产乱码久久久久久蜜柚 | 国产欧美日韩一区 | 五月婷婷综合网 | 亚洲欧美一区二区三区在线 | 国产精品一二三四区 | 依人在线 | 久久久国产一区二区三区 | 夜夜草av| 亚洲天堂免费视频 | 日韩精品视频在线免费观看 | 三级视频在线观看 | yy6080午夜| 亚洲精品免费在线 | 日韩视频免费在线观看 | 日本国产在线观看 | 九九热视频在线观看 | 91久久国产精品 | 玖玖在线播放 | 天天躁日日躁狠狠躁av麻豆男男 | 在线视频亚洲 | 久久一区| 午夜拍拍 | 一区二区三区久久 | 在线观看欧美日韩视频 | 九九热在线精品 | 亚洲精品久久久久 | 黄a视频 | 国产黄色精品 |