第一種情況:
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...