struct記憶體對齊:gcc與VC的差別

來源:互聯網
上載者:User

記憶體對齊是編譯器為了便於CPU快速存取而採用的一項技術,對於不同的編譯器有不同的處理方法。

Win32平台下的微軟VC編譯器在預設情況下採用如下的對齊規則: 任何基礎資料型別 (Elementary Data Type)T的對齊模數就是T的大小,即sizeof(T)。比如對於double類型(8位元組),就要求該類型資料的地址總是8的倍數,而char類型資料(1位元組)則可以從任何一個地址開始。Linux下的GCC奉行的是另外一套規則:任何2位元組大小(包括單位元組嗎?)的資料類型(比如short)的對齊模數是2,而其它所有超過2位元組的資料類型(比如long,double)都以4為對齊模數。

下面的程式可以驗證:

#include <stdio.h>
#define OFFSET(TYPE,MEMBER)  ((int)(&(((TYPE*)0)->MEMBER)))
typedef struct
{
    int a;
    float b;
    char c;
    double d;
    int *pa;
    char *pc;
}Sta;
int main()
{
    printf("a_=%d\n",OFFSET(Sta,a));
    printf("b_=%d\n",OFFSET(Sta,b));
    printf("c_=%d\n",OFFSET(Sta,c));
    printf("d_=%d\n",OFFSET(Sta,d));
    printf("pa_=%d\n",OFFSET(Sta,pa));
    printf("pc_=%d\n",OFFSET(Sta,pc));
    return 0;
}

在VC上的結果是:

而在linux下的結果卻是:

主要是對於double類型,VC採用的是8對齊,而gcc採用的是4對齊


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.