C語言其實是一門很簡單的學科,但是也是一門很神秘的學科,各類代碼拼接到一起就能實現(xiàn)各種各樣的功能。我們知道,由于硬件平臺之間對存儲空間的處理上是有很大不同的,一些平臺對某些特定類型的數(shù)據(jù)只能從某些特定地址開始存取,如通常有些架構(gòu)的CPU要求在編程時必須保證字節(jié)對齊,否則訪問一個沒有進行字節(jié)對齊的變量的時候會發(fā)生錯誤。
然而,有些平臺可能沒有上述的情況,但是通常的情況是如果我們編程的時候不按照適合其平臺要求對數(shù)據(jù)存放進行對齊,會在存取效率上帶來損失。比如有些平臺每次讀都是從偶地址開始,如我們操作一個int型數(shù)據(jù),如果存放在偶地址開始的地方,那么一個讀周期就可以讀出,而如果存放在奇地址開始的地方,就可能會需要2個讀周期,兩個周期讀取出來的字節(jié)我們還要對它們進行高低字節(jié)的拼湊才能得到該int型數(shù)據(jù),從而使得我們的讀取效率較低,這也從側(cè)面反映出了一個問題,就是我們很多時候是在犧牲空間來節(jié)省時間的。
可能通過上面的講解您還是不太明白C語言,那我們再來看一下什么是字節(jié)對齊呢?我們現(xiàn)在的計算機中內(nèi)存空間都是按照字節(jié)來進行劃分的,從理論上來講的話似乎對任何類型的變量的訪問可以從任何地址開始,然而值得注意的就是,實際情況下在訪問特定變量的時候經(jīng)常在特定的內(nèi)存地址訪問,從而就需要各種類型的數(shù)據(jù)按照一定的規(guī)則在空間上排列,而不是順序的一個接一個的排放,這就是對齊。
在此之前,不得不提的一個操作符就是sizeof,其作用就是返回一個對象或者類型所占的內(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編譯是沒有任何問題的,對于void類型,其長度為1,但是如果我們在vc6下面運行的話話就會出現(xiàn)illegal sizeof operand錯誤,所以我們稱之為操作符更加的準確些,既然是操作符,那么我們來看看它的幾種使用方式:
1、sizeof( object ); // sizeof( 對象 );
2、 sizeof( type_name ); // sizeof( 類型 );
3、sizeof object; // sizeof 對象; 通常這種寫法我們在代碼中都不會使用,所以很少見到。
下面來看段代碼加深下印象:
[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 ;
}
運行結(jié)果為:
[html] view plaincopysizeof(i): 4
sizeof(4): 4
sizeof(4+2.5): 8
sizeof(int): 4
sizeof 5: 4
Press any key to continue
從運行結(jié)果我們可以看出上面的幾種使用方式,實際上,sizeof計算對象的大小也是轉(zhuǎn)換成對對象類型的計算,也就是說,同種類型的不同對象其sizeof值都是一樣的。從給出的代碼中我們也可以看出sizeof可以對一個表達式求值,編譯器根據(jù)表達式的最終結(jié)果類型來確定大小,但是一般不會對表達式進行計算或者當表達式為函數(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 ;
}
運行結(jié)果為:
[html] view plaincopysizeof(print()): 4
Press any key to continue