mooc课程精选,成品人片观看入口众乐乐,久久久久人妻一区精品性色av,苍兰诀大结局是什么,白丝美女被狂躁免费视频网站

當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > C語(yǔ)言中的字節(jié)對(duì)齊

C語(yǔ)言中的字節(jié)對(duì)齊 時(shí)間:2018-09-28      來(lái)源:未知

1、什么是對(duì)齊?

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

2、為什么要對(duì)齊?

為了提高效率,計(jì)算機(jī)從內(nèi)存中取數(shù)據(jù)是按照一個(gè)固定長(zhǎng)度的。以32位機(jī)為例,它每次取32個(gè)位,也就是4個(gè)字節(jié)(每字節(jié)8個(gè)位)。字節(jié)對(duì)齊有什么好處?以int型數(shù)據(jù)為例,如果它在內(nèi)存中存放的位置按4字節(jié)對(duì)齊,也就是說(shuō)1個(gè)int的數(shù)據(jù)全部落在計(jì)算機(jī)一次取數(shù)的區(qū)間內(nèi),那么只需要取一次就可以了。如圖a-1。如果不對(duì)齊,很不巧,這個(gè)int數(shù)據(jù)剛好跨越了取數(shù)的邊界,這樣就需要取兩次才能把這個(gè)int的數(shù)據(jù)全部取到,這樣效率也就降低了。



內(nèi)存對(duì)齊是會(huì)浪費(fèi)一些空間的。但是這種空間上得浪費(fèi)卻可以減少取數(shù)的時(shí)間。這是典型的一種以空間換時(shí)間的做法。空間與時(shí)間孰優(yōu)孰略這個(gè)每個(gè)人都有自己的看法,但是C語(yǔ)言既然采取了這種以空間換時(shí)間的策略,就必然有它的道理。況且,在存儲(chǔ)器越來(lái)越便宜的今天,這一點(diǎn)點(diǎn)的空間上的浪費(fèi)就不算什么了。

需要說(shuō)明的是,字節(jié)對(duì)齊不同的編譯器可能會(huì)采用不同的優(yōu)化策略。

3、如何實(shí)現(xiàn)對(duì)齊?

在缺省情況下,C編譯器為每一個(gè)變量或是數(shù)據(jù)單元按其自然對(duì)界條件分配空間。

在結(jié)構(gòu)中,編譯器為結(jié)構(gòu)的每個(gè)成員按其自然對(duì)界(alignment)條件分配空間。各個(gè)成員按照它們被聲明的順序在內(nèi)存中順序存儲(chǔ)(成員之間可能有插入的空字節(jié)),第一個(gè)成員的地址和整個(gè)結(jié)構(gòu)的地址相同。

C編譯器缺省的結(jié)構(gòu)成員自然對(duì)界條件為“N字節(jié)對(duì)齊”,N即該成員數(shù)據(jù)類型的長(zhǎng)度。如int型成員的自然對(duì)界條件為4字節(jié)對(duì)齊,而double類型的結(jié)構(gòu)成員的自然對(duì)界條件為8字節(jié)對(duì)齊。若該成員的起始偏移不位于該成員的“默認(rèn)自然對(duì)界條件”上,則在前一個(gè)節(jié)面后面添加適當(dāng)個(gè)數(shù)的空字節(jié)。

C編譯器缺省的結(jié)構(gòu)整體的自然對(duì)界條件為:該結(jié)構(gòu)所有成員中要求的大自然對(duì)界條件。若結(jié)構(gòu)體各成員長(zhǎng)度之和不為“結(jié)構(gòu)整體自然對(duì)界條件的整數(shù)倍,則在后一個(gè)成員后填充空字節(jié)。

例子1(分析結(jié)構(gòu)各成員的默認(rèn)字節(jié)對(duì)界條界條件和結(jié)構(gòu)整體的默認(rèn)字節(jié)對(duì)界條件):

struct Test

{

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

char x2; // 成員x2為char型(其起始地址必須1字節(jié)對(duì)界,其偏移地址為1

float x3; // 成員x3為float型(其起始地址必須4字節(jié)對(duì)界),編譯器在x2和x3之間填充了兩個(gè)空字節(jié),其偏移地址為4

char x4; // 成員x4為char型(其起始地址必須1字節(jié)對(duì)界),其偏移地址為8

};

因?yàn)門est結(jié)構(gòu)體中,大的成員為flaot x3,因些此結(jié)構(gòu)體的自然對(duì)界條件為4字節(jié)對(duì)齊。則結(jié)構(gòu)體長(zhǎng)度就為12字節(jié),內(nèi)存布局為1100 1111 1000。

例子2:

#include

typedef struct

{

int aa1; //4個(gè)字節(jié)對(duì)齊 1111

char bb1;//1個(gè)字節(jié)對(duì)齊 1

short cc1;//2個(gè)字節(jié)對(duì)齊 011

char dd1; //1個(gè)字節(jié)對(duì)齊 1

} testlength1;

int length1 = sizeof(testlength1); //4個(gè)字節(jié)對(duì)齊,占用字節(jié)1111 1011 1000,length = 12

typedef struct

{

char bb2;//1個(gè)字節(jié)對(duì)齊 1

int aa2; //4個(gè)字節(jié)對(duì)齊 01111

short cc2;//2個(gè)字節(jié)對(duì)齊 11

char dd2; //1個(gè)字節(jié)對(duì)齊 1

} testlength2;

int length2 = sizeof(testlength2); //4個(gè)字節(jié)對(duì)齊,占用字節(jié)1011 1111 1000,length = 12

typedef struct

{

char bb3; //1個(gè)字節(jié)對(duì)齊 1

char dd3; //1個(gè)字節(jié)對(duì)齊 1

int aa3; //4個(gè)字節(jié)對(duì)齊 001111

short cc23;//2個(gè)字節(jié)對(duì)齊 11

} testlength3;

int length3 = sizeof(testlength3); //4個(gè)字節(jié)對(duì)齊,占用字節(jié)1100 1111 1100,length = 12

typedef struct

{

char bb4; //1個(gè)字節(jié)對(duì)齊 1

char dd4; //1個(gè)字節(jié)對(duì)齊 1

short cc4;//2個(gè)字節(jié)對(duì)齊 11

int aa4; //4個(gè)字節(jié)對(duì)齊 1111

} testlength4;

int length4 = sizeof(testlength4); //4個(gè)字節(jié)對(duì)齊,占用字節(jié)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服務(wù)器間數(shù)據(jù)交互 之MySQL搭建

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

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺(tái)專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見(jiàn)科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號(hào)-5京公海網(wǎng)安備11010802025203號(hào)

回到頂部