国产成人精品三级麻豆,色综合天天综合高清网,亚洲精品夜夜夜,国产成人综合在线女婷五月99播放,色婷婷色综合激情国产日韩

當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 淺談字節(jié)對齊

淺談字節(jié)對齊 時(shí)間:2017-11-21      來源:未知

前言

對于字節(jié)對齊,是每個(gè)初學(xué)C語言者都比較容易暈的知識點(diǎn),也是很多的公司在招聘的時(shí)候經(jīng)?嫉降闹R點(diǎn)。但這個(gè)知識點(diǎn)對我們程序的優(yōu)化以及理解計(jì)算機(jī)的運(yùn)行原理又是至關(guān)重要的。所以今天,我們來這個(gè)知識點(diǎn)進(jìn)行一下總結(jié)。

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

簡單來講,就是為了提高數(shù)據(jù)讀取的效率。那為什么字節(jié)對齊會提高數(shù)據(jù)存取的效率呢?主要原因是下面兩個(gè)方面:

1) 外部總線,從內(nèi)存中獲取數(shù)據(jù),并不是按照數(shù)據(jù)存儲的小單位字節(jié)來的,而是4字節(jié)、8字節(jié)甚至更多,那這樣,假如當(dāng)前計(jì)算機(jī)是按照4字節(jié)讀取數(shù)據(jù)的,那么,如果一個(gè)int類型的數(shù)據(jù),在字節(jié)對齊的位置開始存放,則可以一次讀取到,否則需要花兩次才能取到這個(gè)數(shù)據(jù)。

2) 很多的cpu只從對齊的地址開始加載數(shù)據(jù),而有的CPU這樣做,就是為了更快一些。

2. 字節(jié)對齊的原則

1). 變量對齊

變量地址 % min(變量字節(jié)數(shù), 機(jī)器位數(shù)/8) = 0

例:int a;

上邊的例子等價(jià)于:變量地址%4=0 

也就是,計(jì)算機(jī)會為我們開辟一塊,長度為4字節(jié),地址是4的整數(shù)倍的一塊地址空間。

2). 結(jié)構(gòu)體成員變量對齊

結(jié)構(gòu)體成員變量地址 % min(變量字節(jié)數(shù), 機(jī)器位數(shù)/8) = 0;

    理解同1)。

3). 結(jié)構(gòu)體變量對齊

結(jié)構(gòu)體成員變量的大對齊方式相同

例:

struct test

{

char a;

int b;

    short c;

}test;

上邊的結(jié)構(gòu)體中,大的對齊方式為4,則整個(gè)結(jié)構(gòu)體的對齊方式為4,也就是結(jié)構(gòu)體的內(nèi)存地址是4的整數(shù)倍。

4). 結(jié)構(gòu)體成員變量偏移對齊

結(jié)構(gòu)體成員變量偏移 % min(變量字節(jié)數(shù), 機(jī)器位數(shù)/8) = 0;

 

3. 詳細(xì)實(shí)例

struct test

{

char a;

int b;

    short c;

}test;

上邊的結(jié)構(gòu)體變量定義好之后,我們還是詳細(xì)的來看一下,計(jì)算機(jī)為我們做了什么事情。

A:計(jì)算機(jī)首先,從一個(gè)是4的整數(shù)倍的地址開始準(zhǔn)備開辟空間。(因?yàn)榻Y(jié)構(gòu)體的對齊方式與結(jié)構(gòu)體中成員變量大的結(jié)構(gòu)體方式相同。)比如這個(gè)地址值是0x7fff0100。

B: 成員變量a,char類型,根據(jù)對齊原則,這個(gè)成員變量的地址是1的整數(shù)倍即可。則是數(shù)組的地址即可。根據(jù)對齊,會一次開辟4字節(jié)的內(nèi)存空間,a占用第一個(gè)字節(jié)。

C: 成員變量b,int類型,根據(jù)對齊原則,這個(gè)成員變量的地址是4的整數(shù)倍即可。則原來開辟的4字節(jié),已經(jīng)沒有位置滿足這個(gè)變量的對齊了,則會重新分配一個(gè)四字節(jié)的內(nèi)存空間,將成員變量b放到這個(gè)四字節(jié)中,正好放下。

D: 后還有一個(gè)short類型的變量c,則系統(tǒng)又一次性的分配4字節(jié),short c占用其中的兩個(gè)字節(jié)。

將其裝在內(nèi)存中如下:

+---+---+---+---+---+---+---+---+---+---+---+---+

   | a |           |       b       |   c   |       |

+---+---+---+---+---+---+---+---+---+---+---+---+

那么這個(gè)結(jié)構(gòu)體的長度,也就是sizeof(test)=12;

那么接下來,我們換一種定義方式看一下:

struct test

{

char a;

short c;

int b;

}test;

+---+---+---+---+---+---+---+---+

| a |   |    c  |       b       |  

+---+---+---+---+---+---+---+---+

根據(jù)對齊原則,就是上邊的這種存儲方式,可以看到,這種方式的定義,只需要分配8字節(jié)的內(nèi)存空間就夠了。

那我們利用字節(jié)對齊,可以修改定義結(jié)構(gòu)體的順序,是可以達(dá)到節(jié)省空間的效果的。

另外,還會有一些場景,我們會通過指針的偏移的方式訪問結(jié)構(gòu)體內(nèi)存的,這個(gè)時(shí)候,如果我們存在空洞,而寫指針偏移的程序的人沒有注意,是會非常容易出問題的,則這種場景,我們一般會人為的將結(jié)構(gòu)體中的內(nèi)存中的空洞,全部補(bǔ)齊。

比如,上邊兩種定義,我們分別來將其補(bǔ)齊。

struct test

{

char a;

char szResv[3];

int b;

short c;

short sResv;

}test;

struct test

{

char a;

char cResv;

short c;

int b;

}test;

上一篇:FS4412開發(fā)板使用Linux IIO驅(qū)動框架實(shí)現(xiàn)ADC驅(qū)動

下一篇:ARM處理器異常處理

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

回到頂部