C語言的那些小秘密之字節對齊

    2015-04-29 14:51 來源:電子信息網 作者:風鈴

    C語言其實是一門很簡單的學科,但是也是一門很神秘的學科,各類代碼拼接到一起就能實現各種各樣的功能。我們知道,由于硬件平臺之間對存儲空間的處理上是有很大不同的,一些平臺對某些特定類型的數據只能從某些特定地址開始存取,如通常有些架構的CPU要求在編程時必須保證字節對齊,否則訪問一個沒有進行字節對齊的變量的時候會發生錯誤。

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

    可能通過上面的講解您還是不太明白C語言,那我們再來看一下什么是字節對齊呢?我們現在的計算機中內存空間都是按照字節來進行劃分的,從理論上來講的話似乎對任何類型的變量的訪問可以從任何地址開始,然而值得注意的就是,實際情況下在訪問特定變量的時候經常在特定的內存地址訪問,從而就需要各種類型的數據按照一定的規則在空間上排列,而不是順序的一個接一個的排放,這就是對齊。

    在此之前,不得不提的一個操作符就是sizeof,其作用就是返回一個對象或者類型所占的內存字節數。我們為什么不在此稱之為sizeof()函數呢?看看下面一段代碼:

    [html] view plaincopy#include

    void print()

    {

    printf("hello world!\n");

    return ;

    }

    void main()

    {

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

    return ;

    }

    這段代碼在linux環境下我采用gcc編譯是沒有任何問題的,對于void類型,其長度為1,但是如果我們在vc6下面運行的話話就會出現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 ;

    }

    運行結果為:

    圖片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

    從運行結果我們可以看出上面的幾種使用方式,實際上,sizeof計算對象的大小也是轉換成對對象類型的計算,也就是說,同種類型的不同對象其sizeof值都是一樣的。從給出的代碼中我們也可以看出sizeof可以對一個表達式求值,編譯器根據表達式的最終結果類型來確定大小,但是一般不會對表達式進行計算或者當表達式為函數時并不執行函數體。如:

    [html] view plaincopy#include

    int print()

    {

    printf("Hello bigloomy!");

    return 0;

    }

    void main()

    {

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

    return ;

    }

    運行結果為:

    圖片2

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

    Press any key to continue

    1 2 3 > 
    C語言 字節對齊

    相關閱讀

    暫無數據

    一周熱門

    亚洲日韩精品无码专区加勒比☆| 久久久亚洲精华液精华液精华液 | 亚洲午夜一区二区三区| 亚洲成a人片在线观看中文动漫 | 亚洲国产日韩成人综合天堂| 亚洲欧美aⅴ在线资源| 亚洲精品中文字幕无乱码麻豆| 亚洲成无码人在线观看| 亚洲国产综合精品| 亚洲国产综合自在线另类| 亚洲免费视频观看| 亚洲精品亚洲人成在线播放| 国产成人亚洲合集青青草原精品| 狠狠色香婷婷久久亚洲精品| 亚洲成年网站在线观看| 成人亚洲国产va天堂| 亚洲精品美女久久久久久久| 亚洲av成人中文无码专区| 国产大陆亚洲精品国产| 亚洲高清无码在线观看| 久久久久亚洲精品男人的天堂| 国产亚洲精品福利在线无卡一| 亚洲精品无码久久一线| 亚洲AV电影院在线观看| 亚洲黄色在线播放| 亚洲制服丝袜在线播放| 亚洲不卡影院午夜在线观看| 亚洲AV一区二区三区四区| 国产偷国产偷亚洲高清人| 亚洲无码日韩精品第一页| 亚洲午夜福利精品久久 | 亚洲人成网站日本片| 亚洲人成77777在线播放网站不卡 亚洲人成77777在线观看网 | 亚洲人成人无码.www石榴| 亚洲av综合日韩| 中文字幕亚洲专区| 亚洲Aⅴ无码专区在线观看q| 亚洲毛片在线免费观看| 亚洲中文字幕一区精品自拍| 国产成人 亚洲欧洲| 亚洲毛片αv无线播放一区|