1. 程式人生 > >linux和windows gcc g++ vc編譯器位元組對齊

linux和windows gcc g++ vc編譯器位元組對齊

首先可以肯定的說,肯定和編譯器有關,vc編譯器和gcc,g++編譯器肯定不一樣,不說明是什麼編譯器什麼系統下問你結構體長度就是在耍流氓。

(1)vc編譯器下結構體成員首地址地址必須被該結構體成員長度整除,打個比方,double a的首地址如果為0x06, 那是不行的,再填2個位元組將其首地址變為0x08。並且最後的位元組總長度為最寬長度的整數倍,不足補齊(都是按照對齊模數來的)

(2)gcc和g++編譯器是按照對齊模數來對齊的,double型別首元素地址如果為0x04,那麼它不用再往裡填4個位元組補齊,因為32位linux系統gcc編譯器對齊模數預設為4,如果為64

位系統gcc編譯器對齊模數預設為8.當然g++編譯器也一樣,還有32位linux gcc編譯器對齊模數為1,2,4, 64位linux gcc編譯器對齊模數1,2,4,8。程式選擇對齊模數應該是找大於結構體成員位元組數最大值的對齊模數,不超過對齊模數的最大值(4或8)。同時最後的結構體位元組數總和必須是對齊模數的整數倍,不足補齊。

(3)gcc中如果結構體內有另一個結構體物件,則位元組對齊應該是按照不超過結構體內成員最大佔用位元組數的對齊模數來設定的,如果struct test對齊模數是4,則從是4的整數倍地址作為結構體物件成員首地址就可以了

說了這麼多給了例子

struct test                        

{                                                                  

     int a;

     int b;

     double c;

     char d;

}; 

test one;

struct pp

{

    int m;

    struct test n;

};

test two;

32 位linux gcc編譯器 one:20個位元組(4+4+8+1+3 ), two:24個位元組(4+20)

64位linux g++編譯器  one:24個位元組(4+4+8+1+7),two:32個位元組(8+24)

windows vc編譯器one:24個位元組(4+4+8+1+7),two:(32個位元組)(8+24)