• <strike id="aymay"></strike>
    <strike id="aymay"></strike>
    <ul id="aymay"><dfn id="aymay"></dfn></ul>
    <ul id="aymay"><sup id="aymay"></sup></ul>
  • <del id="aymay"></del>

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

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

    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é)果為:

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

    從運行結(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é)果為:

    圖片2

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

    Press any key to continue

    1 2 3 > 
    C語言 字節(jié)對齊

    相關(guān)閱讀

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

    一周熱門

    主站蜘蛛池模板: 中文字幕精品无码一区二区| 人妻少妇精品视中文字幕国语| 亚洲国产精品成人网址天堂| 久热精品人妻视频| 精品国产欧美另类一区 | 国产精品国产三级在线高清观看| 国产亚洲精品资源在线26u| 一本一道久久a久久精品综合| 精品福利一区二区三区| 2023国产精品自拍| 精品一区二区在线观看| 国产成人精品视频一区二区不卡| 亚洲国产精品一区第二页| 四虎影视永久在线精品| 精品水蜜桃久久久久久久| 国产成人无码精品一区在线观看| 影音先锋国产精品国语对白| 久久精品国产99国产精偷 | 精品久久久久久国产免费了| 久久99久久99小草精品免视看| 欧洲精品久久久av无码电影| 无码精品人妻一区二区三区漫画 | 久久精品亚洲日本波多野结衣| 亚洲精品无码专区2| 亚洲福利精品一区二区三区| 日韩精品人成在线播放| 欧美精品在线免费| 午夜成人精品福利网站在线观看 | 久久精品成人欧美大片| 国内精品久久久久久久久电影网 | 国产乱人伦精品一区二区在线观看 | 91精品婷婷国产综合久久| 欧美国产日韩精品| 亚洲日韩精品欧美一区二区| 91在线手机精品超级观看| 国产成人精品综合在线观看 | 国产精品玖玖美女张开腿让男人桶爽免费看 | 亚洲视频精品在线| 国产精品自在欧美一区| 天天爽夜夜爽8888视频精品| 中文字幕精品一区二区三区视频|