<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > C語(yǔ)言字節對齊詳解

C語(yǔ)言字節對齊詳解

作者: 時(shí)間:2012-06-26 來(lái)源:網(wǎng)絡(luò ) 收藏

一、什么是對齊,以及為什么要對齊:

本文引用地址:http://dyxdggzs.com/article/148849.htm

  1. 現代計算機中內存空間都是按照byte劃分的,從理論上講似乎對任何類(lèi)型的變量的訪(fǎng)問(wèn)可以從任何地址開(kāi)始,但實(shí)際情況是在訪(fǎng)問(wèn)特定變量的時(shí)候經(jīng)常在特定的內存地址訪(fǎng)問(wèn),這就需要各類(lèi)型數據按照一定的規則在空間上排列,而不是順序的一個(gè)接一個(gè)的排放,這就是對齊。

  2. 對齊的作用和原因:各個(gè)硬件平臺對存儲空間的處理上有很大的不同。一些平臺對某些特定類(lèi)型的數據只能從某些特定地址開(kāi)始存取。其他平臺可能沒(méi)有這種情況,但是最常見(jiàn)的是如果不按照適合其平臺的要求對數據存放進(jìn)行對齊,會(huì )在存取效率上帶來(lái)?yè)p失。比如有些平臺每次讀都是從偶地址開(kāi)始,如果一個(gè)int型(假設為 32位)如果存放在偶地址開(kāi)始的地方,那么一個(gè)讀周期就可以讀出,而如果存放在奇地址開(kāi)始的地方,就可能會(huì )需要2個(gè)讀周期,并對兩次讀出的結果的高低 進(jìn)行拼湊才能得到該int數據。顯然在讀取效率上下降很多。這也是空間和時(shí)間的博弈。

  二、對齊的實(shí)現

  通常,我們寫(xiě)程序的時(shí)候,不需要考慮對齊問(wèn)題。編譯器會(huì )替我們選擇適合目標平臺的對齊策略。當然,我們也可以通知給編譯器傳遞預編譯指令而改變對指定數據的對齊方法。

  但是,正因為我們一般不需要關(guān)心這個(gè)問(wèn)題,所以因為編輯器對數據存放做了對齊,而我們不了解的話(huà),常常會(huì )對一些問(wèn)題感到迷惑。最常見(jiàn)的就是struct數據結構的sizeof結果,出乎意料。為此,我們需要對對齊算法所了解。

  對齊的算法:

  由于各個(gè)平臺和編譯器的不同,現以本人使用的gcc version 3.2.2編譯器(32位x86平臺)為例子,來(lái)討論編譯器對struct數據結構中的各成員如何進(jìn)行對齊的。

  設結構體如下定義:

  struct A {

  int a;

  char b;

  short c;

  };

  結構體A中包含了4長(cháng)度的int一個(gè),1長(cháng)度的char一個(gè)和2字節長(cháng)度的short型數據一個(gè)。所以A用到的空間應該是7字節。但是因為編譯器要對數據成員在空間上進(jìn)行對齊。

  所以使用sizeof(strcut A)值為8。

  現在把該結構體調整成員變量的順序。

  struct B {

  char b;

  int a;

  short c;

  };

  這時(shí)候同樣是總共7個(gè)字節的變量,但是sizeof(struct B)的值卻是12。

  下面我們使用預編譯指令#pragma pack (value)來(lái)告訴編譯器,使用我們指定的對齊值來(lái)取代缺省的。

  #pragma pack (2) /*指定按2字節對齊*/

  struct C {

  char b;

  int a;

  short c;

  };

  #pragma pack () /*取消指定對齊,恢復缺省對齊*/

  sizeof(struct C)值是8。

  修改對齊值為1:

  #pragma pack (1) /*指定按1字節對齊*/

  struct D {

  char b;

  int a;

  short c;

  };


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: 詳解 字節 語(yǔ)言

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>