首頁 考試吧論壇 Exam8視線 考試商城 網(wǎng)絡(luò)課程 模擬考試 考友錄 實(shí)用文檔 求職招聘 論文下載
2011中考 | 2011高考 | 2012考研 | 考研培訓(xùn) | 在職研 | 自學(xué)考試 | 成人高考 | 法律碩士 | MBA考試
MPA考試 | 中科院
四六級(jí) | 職稱英語 | 商務(wù)英語 | 公共英語 | 托福 | 雅思 | 專四專八 | 口譯筆譯 | 博思 | GRE GMAT
新概念英語 | 成人英語三級(jí) | 申碩英語 | 攻碩英語 | 職稱日語 | 日語學(xué)習(xí) | 法語 | 德語 | 韓語
計(jì)算機(jī)等級(jí)考試 | 軟件水平考試 | 職稱計(jì)算機(jī) | 微軟認(rèn)證 | 思科認(rèn)證 | Oracle認(rèn)證 | Linux認(rèn)證
華為認(rèn)證 | Java認(rèn)證
公務(wù)員 | 報(bào)關(guān)員 | 銀行從業(yè)資格 | 證券從業(yè)資格 | 期貨從業(yè)資格 | 司法考試 | 法律顧問 | 導(dǎo)游資格
報(bào)檢員 | 教師資格 | 社會(huì)工作者 | 外銷員 | 國際商務(wù)師 | 跟單員 | 單證員 | 物流師 | 價(jià)格鑒證師
人力資源 | 管理咨詢師考試 | 秘書資格 | 心理咨詢師考試 | 出版專業(yè)資格 | 廣告師職業(yè)水平
駕駛員 | 網(wǎng)絡(luò)編輯
衛(wèi)生資格 | 執(zhí)業(yè)醫(yī)師 | 執(zhí)業(yè)藥師 | 執(zhí)業(yè)護(hù)士
會(huì)計(jì)從業(yè)資格考試會(huì)計(jì)證) | 經(jīng)濟(jì)師 | 會(huì)計(jì)職稱 | 注冊(cè)會(huì)計(jì)師 | 審計(jì)師 | 注冊(cè)稅務(wù)師
注冊(cè)資產(chǎn)評(píng)估師 | 高級(jí)會(huì)計(jì)師 | ACCA | 統(tǒng)計(jì)師 | 精算師 | 理財(cái)規(guī)劃師 | 國際內(nèi)審師
一級(jí)建造師 | 二級(jí)建造師 | 造價(jià)工程師 | 造價(jià)員 | 咨詢工程師 | 監(jiān)理工程師 | 安全工程師
質(zhì)量工程師 | 物業(yè)管理師 | 招標(biāo)師 | 結(jié)構(gòu)工程師 | 建筑師 | 房地產(chǎn)估價(jià)師 | 土地估價(jià)師 | 巖土師
設(shè)備監(jiān)理師 | 房地產(chǎn)經(jīng)紀(jì)人 | 投資項(xiàng)目管理師 | 土地登記代理人 | 環(huán)境影響評(píng)價(jià)師 | 環(huán)保工程師
城市規(guī)劃師 | 公路監(jiān)理師 | 公路造價(jià)師 | 安全評(píng)價(jià)師 | 電氣工程師 | 注冊(cè)測(cè)繪師 | 注冊(cè)計(jì)量師
繽紛校園 | 實(shí)用文檔 | 英語學(xué)習(xí) | 作文大全 | 求職招聘 | 論文下載 | 訪談 | 游戲

二級(jí)C語言:typedefPACKEDstruct字節(jié)對(duì)齊詳解

本文為“計(jì)算機(jī)二級(jí)C語言:typedefPACKEDstruct字節(jié)對(duì)齊詳解”,更多有關(guān)計(jì)算機(jī)等級(jí)考試三級(jí)信息管理資料,請(qǐng)?jiān)L問考試吧計(jì)算機(jī)等級(jí)考試頻道。

  六.字節(jié)對(duì)齊可能帶來的隱患:

  代碼中關(guān)于對(duì)齊的隱患,很多是隱式的。比如在強(qiáng)制類型轉(zhuǎn)換的時(shí)候。例如:

  unsigned int i = 0x12345678;

  unsigned char *p=NULL;

  unsigned short *p1=NULL;

  p=&i;

  *p=0x00;

  p1=(unsigned short *)(p+1);

  *p1=0x0000;

  最后兩句代碼,從奇數(shù)邊界去訪問unsignedshort型變量,顯然不符合對(duì)齊的規(guī)定。

  在x86上,類似的操作只會(huì)影響效率,但是在MIPS或者sparc上,可能就是一個(gè)error,因?yàn)樗鼈円蟊仨氉止?jié)對(duì)齊.

  七.如何查找與字節(jié)對(duì)齊方面的問題:

  如果出現(xiàn)對(duì)齊或者賦值問題首先查看

  1. 編譯器的big little端設(shè)置

  2. 看這種體系本身是否支持非對(duì)齊訪問

  3. 如果支持看設(shè)置了對(duì)齊與否,如果沒有則看訪問時(shí)需要加某些特殊的修飾來標(biāo)志其特殊訪問操作。

  arm下的對(duì)齊處理

  from DUI0067D_ADS1_2_CompLib

  3.13 type   qulifiers

  有部分摘自arm編譯器文檔對(duì)齊部分

  對(duì)齊的使用:

  1.__align(num)

  這個(gè)用于修改最高級(jí)別對(duì)象的字節(jié)邊界。在匯編中使用LDRD或者STRD時(shí)

  就要用到此命令__align(8)進(jìn)行修飾限制。來保證數(shù)據(jù)對(duì)象是相應(yīng)對(duì)齊。

  這個(gè)修飾對(duì)象的命令最大是8個(gè)字節(jié)限制,可以讓2字節(jié)的對(duì)象進(jìn)行4字節(jié)

  對(duì)齊,但是不能讓4字節(jié)的對(duì)象2字節(jié)對(duì)齊。

  __align是存儲(chǔ)類修改,他只修飾最高級(jí)類型對(duì)象不能用于結(jié)構(gòu)或者函數(shù)對(duì)象。

  2.__packed

  __packed是進(jìn)行一字節(jié)對(duì)齊

  1.不能對(duì)packed的對(duì)象進(jìn)行對(duì)齊

  2.所有對(duì)象的讀寫訪問都進(jìn)行非對(duì)齊訪問

  3.float及包含float的結(jié)構(gòu)聯(lián)合及未用__packed的對(duì)象將不能字節(jié)對(duì)齊

  4.__packed對(duì)局部整形變課抻跋?BR>   5.強(qiáng)制由unpacked對(duì)象向packed對(duì)象轉(zhuǎn)化是未定義,整形指針可以合法定

  義為packed。

  __packed int* p;   //__packed int 則沒有意義

  6.對(duì)齊或非對(duì)齊讀寫訪問帶來問題

  __packed struct STRUCT_TEST

  {

  char a;

  int b;

  char c;

  }   ;     //定義如下結(jié)構(gòu)此時(shí)b的起始地址一定是不對(duì)齊的

  //在棧中訪問b可能有問題,因?yàn)闂I蠑?shù)據(jù)肯定是對(duì)齊訪問[from CL]

  //將下面變量定義成全局靜態(tài)不在棧上

  static char* p;

  static struct STRUCT_TEST a;

  void Main()

  {

  __packed int* q;   //此時(shí)定義成__packed來修飾當(dāng)前q指向?yàn)榉菍?duì)齊的數(shù)據(jù)地址下面的訪問則可以

  p = (char*)&a;

  q = (int*)(p+1);

  *q = 0x87654321;

  /*

  得到賦值的匯編指令很清楚

  ldr       r5,0x20001590 ; = #0x12345678

  [0xe1a00005]    mov       r0,r5

  [0xeb0000b0]    bl        __rt_uwrite4   //在此處調(diào)用一個(gè)寫4byte的操作函數(shù)

  [0xe5c10000]    strb      r0,[r1,#0]    //函數(shù)進(jìn)行4次strb操作然后返回保證了數(shù)據(jù)正確的訪問

  [0xe1a02420]    mov       r2,r0,lsr #8

  [0xe5c12001]    strb      r2,[r1,#1]

  [0xe1a02820]    mov       r2,r0,lsr #16

  [0xe5c12002]    strb      r2,[r1,#2]

  [0xe1a02c20]    mov       r2,r0,lsr #24

  [0xe5c12003]    strb      r2,[r1,#3]

  [0xe1a0f00e]    mov       pc,r14

  */

  /*

  如果q沒有加__packed修飾則匯編出來指令是這樣直接會(huì)導(dǎo)致奇地址處訪問失敗

  [0xe59f2018]    ldr       r2,0x20001594 ; = #0x87654321

  [0xe5812000]    str       r2,[r1,#0]

  */

  //這樣可以很清楚的看到非對(duì)齊訪問是如何產(chǎn)生錯(cuò)誤的

  //以及如何消除非對(duì)齊訪問帶來問題

  //也可以看到非對(duì)齊訪問和對(duì)齊訪問的指令差異導(dǎo)致效率問題

  }

上一頁  1 2 3 4  下一頁
  相關(guān)推薦:計(jì)算機(jī)等考二級(jí)C:C中如何顯示*.bmp文件
       計(jì)算機(jī)等考二級(jí):關(guān)于C語言中無符號(hào)數(shù)和有符號(hào)數(shù)
       C語言中標(biāo)準(zhǔn)輸入流、標(biāo)準(zhǔn)輸出流、標(biāo)準(zhǔn)錯(cuò)誤輸出流
文章搜索
版權(quán)聲明:如果計(jì)算機(jī)等級(jí)考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請(qǐng)與我們聯(lián)系800@exam8.com,我們將會(huì)及時(shí)處理。如轉(zhuǎn)載本計(jì)算機(jī)等級(jí)考試網(wǎng)內(nèi)容,請(qǐng)注明出處。