久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > C語言中的字(zi)節對齊

C語(yu)言(yan)中的(de)字節對齊 時間:2018-09-28      來源:未(wei)知

1、什么(me)是對齊?

現代計算機中內(nei)存空(kong)間(jian)都是(shi)按(an)照字節(jie)(byte)劃分的(de),從(cong)理論上講似(si)乎(hu)對任何類型(xing)的(de)變(bian)量的(de)訪問可以(yi)從(cong)任何地址開(kai)始,但實際情況是(shi)在(zai)(zai)訪問特定變(bian)量的(de)時(shi)候(hou)經(jing)常在(zai)(zai)特定的(de)內(nei)存地址訪問,這(zhe)就需要各(ge)類型(xing)數據按(an)照一(yi)定的(de)規則在(zai)(zai)空(kong)間(jian)上排(pai)列,而不(bu)是(shi)順序地一(yi)個接(jie)一(yi)個地排(pai)放,這(zhe)就是(shi)對齊。

2、為什么(me)要對齊(qi)?

為了提高效(xiao)(xiao)率,計(ji)算機從內存(cun)(cun)中取(qu)(qu)數據(ju)是按照一個(ge)固定長度(du)的(de)(de)。以32位機為例,它每次取(qu)(qu)32個(ge)位,也(ye)就(jiu)是4個(ge)字節(jie)(jie)(每字節(jie)(jie)8個(ge)位)。字節(jie)(jie)對(dui)(dui)齊(qi)有什(shen)么(me)好處(chu)?以int型數據(ju)為例,如(ru)果它在(zai)內存(cun)(cun)中存(cun)(cun)放的(de)(de)位置按4字節(jie)(jie)對(dui)(dui)齊(qi),也(ye)就(jiu)是說1個(ge)int的(de)(de)數據(ju)全部(bu)落在(zai)計(ji)算機一次取(qu)(qu)數的(de)(de)區間(jian)內,那(nei)么(me)只需要(yao)取(qu)(qu)一次就(jiu)可以了。如(ru)圖a-1。如(ru)果不對(dui)(dui)齊(qi),很不巧(qiao),這(zhe)(zhe)個(ge)int數據(ju)剛好跨越了取(qu)(qu)數的(de)(de)邊界,這(zhe)(zhe)樣就(jiu)需要(yao)取(qu)(qu)兩次才(cai)能把這(zhe)(zhe)個(ge)int的(de)(de)數據(ju)全部(bu)取(qu)(qu)到,這(zhe)(zhe)樣效(xiao)(xiao)率也(ye)就(jiu)降低了。



內存對(dui)齊是(shi)(shi)(shi)(shi)會(hui)浪費一些空(kong)間的(de)(de)(de)。但是(shi)(shi)(shi)(shi)這(zhe)種空(kong)間上得浪費卻可以減(jian)少取數的(de)(de)(de)時(shi)間。這(zhe)是(shi)(shi)(shi)(shi)典型(xing)的(de)(de)(de)一種以空(kong)間換時(shi)間的(de)(de)(de)做法。空(kong)間與時(shi)間孰優孰略(lve)(lve)這(zhe)個每個人都有(you)自(zi)己的(de)(de)(de)看法,但是(shi)(shi)(shi)(shi)C語言既然采取了這(zhe)種以空(kong)間換時(shi)間的(de)(de)(de)策略(lve)(lve),就(jiu)必然有(you)它的(de)(de)(de)道理。況(kuang)且,在存儲器(qi)越來越便宜的(de)(de)(de)今天,這(zhe)一點點的(de)(de)(de)空(kong)間上的(de)(de)(de)浪費就(jiu)不算什么了。

需要說明的(de)是(shi),字節對齊(qi)不同的(de)編譯器可能會采用不同的(de)優(you)化策略。

3、如何實現(xian)對齊?

在缺(que)省情況下(xia),C編譯器為每一個(ge)變量或是數據單元按其自(zi)然對界條件分配空間。

在(zai)結(jie)(jie)構(gou)(gou)中,編譯(yi)器為結(jie)(jie)構(gou)(gou)的(de)每個(ge)(ge)成(cheng)(cheng)員按其自然(ran)對界(alignment)條件分配空間(jian)(jian)。各個(ge)(ge)成(cheng)(cheng)員按照它們被聲(sheng)明的(de)順序在(zai)內存中順序存儲(成(cheng)(cheng)員之間(jian)(jian)可(ke)能有插入的(de)空字節),第一個(ge)(ge)成(cheng)(cheng)員的(de)地址和整個(ge)(ge)結(jie)(jie)構(gou)(gou)的(de)地址相同。

C編譯器缺省的結構(gou)成(cheng)員(yuan)自(zi)然對(dui)界條(tiao)(tiao)件(jian)為(wei)“N字節(jie)對(dui)齊”,N即該成(cheng)員(yuan)數據類(lei)型(xing)的長度(du)。如int型(xing)成(cheng)員(yuan)的自(zi)然對(dui)界條(tiao)(tiao)件(jian)為(wei)4字節(jie)對(dui)齊,而double類(lei)型(xing)的結構(gou)成(cheng)員(yuan)的自(zi)然對(dui)界條(tiao)(tiao)件(jian)為(wei)8字節(jie)對(dui)齊。若該成(cheng)員(yuan)的起始偏移不位于該成(cheng)員(yuan)的“默認自(zi)然對(dui)界條(tiao)(tiao)件(jian)”上,則(ze)在前一個(ge)節(jie)面(mian)后面(mian)添加適(shi)當個(ge)數的空字節(jie)。

C編譯器缺省的結構(gou)整(zheng)體的自然對界條(tiao)件為:該結構(gou)所(suo)有成員中要求的大自然對界條(tiao)件。若結構(gou)體各成員長度之和不為“結構(gou)整(zheng)體自然對界條(tiao)件的整(zheng)數(shu)倍(bei),則在后一個(ge)成員后填充空字節。

例子(zi)1(分析(xi)結構(gou)各成員(yuan)的(de)默認字節(jie)對(dui)界條(tiao)界條(tiao)件(jian)和(he)結構(gou)整體的(de)默認字節(jie)對(dui)界條(tiao)件(jian)):

struct Test

{

 char x1; // 成員(yuan)x1為char型(其起始(shi)地址必須1字節對界),其偏移地址為0

char x2; // 成(cheng)員x2為(wei)char型(其(qi)起始地址必須1字(zi)節(jie)對界,其(qi)偏(pian)移地址為(wei)1

 float x3; // 成員(yuan)x3為(wei)(wei)float型(其(qi)起始地址(zhi)必須4字節(jie)對界(jie)),編譯器在x2和x3之(zhi)間填充了(le)兩個空字節(jie),其(qi)偏移(yi)地址(zhi)為(wei)(wei)4

char x4; // 成員x4為(wei)char型(其(qi)起始地(di)址必須1字節對界),其(qi)偏移地(di)址為(wei)8

};

因(yin)為Test結構(gou)(gou)體(ti)(ti)中,大的成員為flaot x3,因(yin)些此結構(gou)(gou)體(ti)(ti)的自然(ran)對(dui)(dui)界條件(jian)為4字節(jie)對(dui)(dui)齊。則結構(gou)(gou)體(ti)(ti)長度就為12字節(jie),內存布(bu)局為1100 1111 1000。

例子2:

#include

typedef struct

{

int aa1; //4個字節(jie)對齊 1111

char bb1;//1個字(zi)節(jie)對齊 1

short cc1;//2個字節對齊 011

char dd1; //1個字(zi)節對齊(qi) 1

} testlength1;

int length1 = sizeof(testlength1); //4個(ge)字節對齊(qi),占用(yong)字節1111 1011 1000,length = 12

typedef struct

{

char bb2;//1個(ge)字節(jie)對(dui)齊 1

int aa2; //4個(ge)字(zi)節對齊 01111

short cc2;//2個字節對齊(qi) 11

char dd2; //1個字節對齊(qi) 1

} testlength2;

int length2 = sizeof(testlength2); //4個(ge)字節(jie)對齊,占用字節(jie)1011 1111 1000,length = 12

typedef struct

{

char bb3; //1個字節對齊 1

char dd3; //1個字節(jie)對齊 1

int aa3; //4個字節(jie)對齊 001111

short cc23;//2個字節對齊 11

} testlength3;

int length3 = sizeof(testlength3); //4個字節(jie)對齊(qi),占用字節(jie)1100 1111 1100,length = 12

typedef struct

{

char bb4; //1個字節對(dui)齊 1

char dd4; //1個字節對齊(qi) 1

short cc4;//2個字節對齊(qi) 11

int aa4; //4個字節對(dui)齊 1111

} testlength4;

int length4 = sizeof(testlength4); //4個(ge)字節對齊,占用字節1111 1111,length = 8

int main(void)

{

printf("length1 = %d.\n",length1);

printf("length2 = %d.\n",length2);

printf("length3 = %d.\n",length3);

printf("length4 = %d.\n",length4);

return 0;

}

上一篇:Anddroid App和Java Web服務器間數據交互 之MySQL搭建

下一篇:SylixOS電源管理概述以及接口介紹

熱點文章推薦
華清學員就業(ye)榜單
高(gao)薪學員經驗分享(xiang)
熱點新聞推(tui)薦(jian)
前(qian)臺專線(xian):010-82525158 企業培訓洽談專(zhuan)線:010-82525379 院(yuan)校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部