C語(yǔ)言的那些小秘密之字節(jié)對(duì)齊

2015-04-29 14:51 來(lái)源:電子信息網(wǎng) 作者:風(fēng)鈴

C語(yǔ)言其實(shí)是一門很簡(jiǎn)單的學(xué)科,但是也是一門很神秘的學(xué)科,各類代碼拼接到一起就能實(shí)現(xiàn)各種各樣的功能。我們知道,由于硬件平臺(tái)之間對(duì)存儲(chǔ)空間的處理上是有很大不同的,一些平臺(tái)對(duì)某些特定類型的數(shù)據(jù)只能從某些特定地址開(kāi)始存取,如通常有些架構(gòu)的CPU要求在編程時(shí)必須保證字節(jié)對(duì)齊,否則訪問(wèn)一個(gè)沒(méi)有進(jìn)行字節(jié)對(duì)齊的變量的時(shí)候會(huì)發(fā)生錯(cuò)誤。

然而,有些平臺(tái)可能沒(méi)有上述的情況,但是通常的情況是如果我們編程的時(shí)候不按照適合其平臺(tái)要求對(duì)數(shù)據(jù)存放進(jìn)行對(duì)齊,會(huì)在存取效率上帶來(lái)?yè)p失。比如有些平臺(tái)每次讀都是從偶地址開(kāi)始,如我們操作一個(gè)int型數(shù)據(jù),如果存放在偶地址開(kāi)始的地方,那么一個(gè)讀周期就可以讀出,而如果存放在奇地址開(kāi)始的地方,就可能會(huì)需要2個(gè)讀周期,兩個(gè)周期讀取出來(lái)的字節(jié)我們還要對(duì)它們進(jìn)行高低字節(jié)的拼湊才能得到該int型數(shù)據(jù),從而使得我們的讀取效率較低,這也從側(cè)面反映出了一個(gè)問(wèn)題,就是我們很多時(shí)候是在犧牲空間來(lái)節(jié)省時(shí)間的。

可能通過(guò)上面的講解您還是不太明白C語(yǔ)言,那我們?cè)賮?lái)看一下什么是字節(jié)對(duì)齊呢?我們現(xiàn)在的計(jì)算機(jī)中內(nèi)存空間都是按照字節(jié)來(lái)進(jìn)行劃分的,從理論上來(lái)講的話似乎對(duì)任何類型的變量的訪問(wèn)可以從任何地址開(kāi)始,然而值得注意的就是,實(shí)際情況下在訪問(wèn)特定變量的時(shí)候經(jīng)常在特定的內(nèi)存地址訪問(wèn),從而就需要各種類型的數(shù)據(jù)按照一定的規(guī)則在空間上排列,而不是順序的一個(gè)接一個(gè)的排放,這就是對(duì)齊。

在此之前,不得不提的一個(gè)操作符就是sizeof,其作用就是返回一個(gè)對(duì)象或者類型所占的內(nèi)存字節(jié)數(shù)。我們?yōu)槭裁床辉诖朔Q之為sizeof()函數(shù)呢?看看下面一段代碼:

[html] view plaincopy#include

void print()

{

printf("hello world!\n");

return ;

}

void main()

{

printf("%d\n",sizeof(print()));

return ;

}

這段代碼在linux環(huán)境下我采用gcc編譯是沒(méi)有任何問(wèn)題的,對(duì)于void類型,其長(zhǎng)度為1,但是如果我們?cè)趘c6下面運(yùn)行的話話就會(huì)出現(xiàn)illegal sizeof operand錯(cuò)誤,所以我們稱之為操作符更加的準(zhǔn)確些,既然是操作符,那么我們來(lái)看看它的幾種使用方式:

1、sizeof( object ); // sizeof( 對(duì)象 );

2、 sizeof( type_name ); // sizeof( 類型 );

3、sizeof object; // sizeof 對(duì)象; 通常這種寫(xiě)法我們?cè)诖a中都不會(huì)使用,所以很少見(jiàn)到。

下面來(lái)看段代碼加深下印象:

[html] view plaincopy#include

void main()

{

int i;

printf("sizeof(i):\t%d\n",sizeof(i));

printf("sizeof(4):\t%d\n",sizeof(4));

printf("sizeof(4+2.5):\t%d\n",sizeof(4+2.5));

printf("sizeof(int):\t%d\n",sizeof(int));

printf("sizeof 5:\t%d\n",sizeof 5);

return ;

}

運(yùn)行結(jié)果為:

圖片1

[html] view plaincopysizeof(i): 4

sizeof(4): 4

sizeof(4+2.5): 8

sizeof(int): 4

sizeof 5: 4

Press any key to continue

從運(yùn)行結(jié)果我們可以看出上面的幾種使用方式,實(shí)際上,sizeof計(jì)算對(duì)象的大小也是轉(zhuǎn)換成對(duì)對(duì)象類型的計(jì)算,也就是說(shuō),同種類型的不同對(duì)象其sizeof值都是一樣的。從給出的代碼中我們也可以看出sizeof可以對(duì)一個(gè)表達(dá)式求值,編譯器根據(jù)表達(dá)式的最終結(jié)果類型來(lái)確定大小,但是一般不會(huì)對(duì)表達(dá)式進(jìn)行計(jì)算或者當(dāng)表達(dá)式為函數(shù)時(shí)并不執(zhí)行函數(shù)體。如:

[html] view plaincopy#include

int print()

{

printf("Hello bigloomy!");

return 0;

}

void main()

{

printf("sizeof(print()):\t%d\n",sizeof(print()));

return ;

}

運(yùn)行結(jié)果為:

圖片2

[html] view plaincopysizeof(print()): 4

Press any key to continue

1 2 3 > 
C語(yǔ)言 字節(jié)對(duì)齊

相關(guān)閱讀

暫無(wú)數(shù)據(jù)

一周熱門