關於記憶體對其問題 三

2021-05-28 13:01:13 字數 2724 閱讀 5125

第一種情況:

struct bbb

long num;                // 4bytes

char *name;            // 4 bytes

short int data;          // 2 bytes

char ha;                    // 1 byte

short ba[5];              // 10 bytes

sizeof(bbb) = 24bytes

理由:1. 很容易知道bbb的記憶體對齊數是4bytes

2. num和name各為4bytes,已經對齊

3. data和ha加起來是3bytes,因此要補1byte

4. ba共10bytes,因此要補2bytes

第二種情況:

struct bbb

long num;                 // 4 bytes

char *name;             // 4 bytes

short int data;           // 2 bytes

char ha;                     // 1 byte

char hb;                     // 1 byte

short ba[5];                // 10 bytes

sizeof(bbb) = 24bytes

理由:1. 很容易知道bbb的記憶體對齊數是4bytes

2. num和name各為4bytes,已經對齊

3. data、ha和hb加起來是4bytes,已經對齊

3. ba共10bytes,因此要補2bytes

第三種情況:

struct bbb

char hb;                 // 1 byte

long num;             // 4 bytes

char *name;         // 4 bytes

short int data;       // 2 bytes

char ha;                 // 1 byte

short ba[5];           // 10 bytes

sizeof(bbb) = 28bytes

理由:1. 很容易知道bbb的記憶體對齊數是4bytes

2. hb為1byte,因此需要補3bytes

3. num和name各為4bytes,已經對齊

4. data、ha加起來是3bytes,因此要補1byte

5. ba共10bytes,因此要補2bytes

通過上述三種情況,我們可以得出推論:

a. 儘管成員變數一樣,如果由於排列的順序不同,則所得到物件的大小也有可能不同

b. 相同資料型別的成員變數,在結構或類定義時,盡量相鄰,這樣可以減少空間的消耗

下面再舉乙個例子,來說明上述推論b:

假定結構bbb定義如下:

struct bbb

char          ha;

int             a;

char          hb;

int             b;

char          hc;

int             c;

那麼sizeof(bbb) = 24bytes

如果結構bbb的定義改為:

struct bbb

char          ha;

char          hb;

char          hc;

int             a;

int             b;

int             c;

那麼sizeof(bbb) = 16bytes

可見在兩種情況下結構bbb所能承載的資料量是一樣的,但所占用的空間卻有很大的不同。

順便簡單複習一下資料型別自身對齊值方面的問題。char型別的對齊數為1byte,short型別為2bytes,int、float和double型別,均為4bytes。由於資料型別有自身對齊值,因此,short型別的變數的起始位址必須為2的倍數,int、float和double型別的變數的起始位址必須為4的倍數。char型別的對齊數為1,所以char型別變數的起始位址,可以在任何有效的位置。請參考下面的**:

#include

using namespace std;

struct foo1

char c1;      // 0            

short s;      // 2 ~ 3       s為short型別,因此其起始位址必須是2的倍數

char c2;     // 4

int i;            // 8 ~ 11    i為int型別,因此其起始位址必須是4的倍數

struct foo2

char c1;      // 0

char c2;      // 1

short s;       // 2 ~ 3

int i;             // 4 ~ 7

int main()

cout << sizeof(foo1) << endl;      // 12

cout << sizeof(foo2) << endl;      // 8

return 0;

pragma pack n 與記憶體對其問題

title pragma pack n 與記憶體對其問題 date 2016 06 08 15 32 11 categories c tags c c 記憶體對齊 pragma pack 作用 遮蔽掉編譯器為變數設定的預設的對其方式,設定自己的對其方式 而 pragma pack n 表示設定變數以...

c語言位元組對其問題

最近除錯網路的服務端程式,自己寫了乙個小客戶端程式來測試,發現服務程式解包錯誤。經除錯發現客戶端的協議頭大小和伺服器端的協議頭大小不一致。原因是伺服器端加了 pragma pack 1 而客戶端沒加。之前沒接觸過這個編譯巨集,現在來認真學習之。首先google之 原來 pragma pack有幾種形...

記憶體對其加速cpu訪問速度原理

記憶體對齊問題是每乙個c程式設計師都應該考慮過的問題,c編譯器的規則明確規定了對齊問題,就是乙個struct中按照最長的型別對齊,比如考慮下面的結構體 struct abc char a int b char c 在32位x86機器上它的大小是多少呢?是12,為什麼呢?因為該結構體中最長的型別是in...