关于 Struct 内存对齐的几个例子
2013-06-29 19:09
731 查看
例子主要是求一個具體的 struct 占幾個字節。
struct的對齊方式:
1.在默認情況下,VC規定各成員變量存放的起始地址相對於結構的起始地址的偏移量必須爲該變量的類型所佔用的字節數的倍數;
2. 結構的大小為結構字節邊界數(即該結構中佔用最大空間的類型所佔用的字節數)的倍數。
有了上述知識再來看如下兩例:
結果是 16 。
解释:按順序分配各成員內存,double 佔用的空間最大為8個字節,為d分配完後,c的偏移量为8,是char占用的一个字节的整数倍,則直接分配一個字節給c,最後的 i 偏移量為9,不是int的整數倍,則自動填充3個字節到12,再分配4個字節給i。這樣一共佔用空間: 8 + 1 + 3 + 4 = 16 字節,恰好它也是佔用最大空間成員double的整數倍,故此結構體佔用16個字節。
如果將A的成員聲明順序改一下:
結果變成了24。
解釋:分配完一個字節給 c 後,要填充7個字節偏移達到8才開始為 d 分配內存,分配完後i的偏移為16,可以為i分配內存,分配完後共占 1 + 7 + 8 + 4 = 20 個字節,再填充4個字節到24 為 double 所佔用內存整數倍。
最後再引申一下,看如下例子,分別求各個結構體所占內存:
結果分別是 8,8,12.
解釋:第一個是8無需過多說明;
第二個有一個static靜態變量,由于靜態變量不在對象中分配空間而在專門的靜態區分配空間,因此在結構中不佔用空間,即sizeof(b)仍為8;
第三個涉及到了虛函數,有虛函數的類會使其對象的開頭位置有一個指向虛函數表的指針,該指針占4個字節,故結果為12。
struct的對齊方式:
1.在默認情況下,VC規定各成員變量存放的起始地址相對於結構的起始地址的偏移量必須爲該變量的類型所佔用的字節數的倍數;
2. 結構的大小為結構字節邊界數(即該結構中佔用最大空間的類型所佔用的字節數)的倍數。
有了上述知識再來看如下兩例:
#include "stdafx.h" struct A { double d; char c; int i; }aa; int _tmain(int argc, _TCHAR* argv[]) { printf("%d\n", sizeof(aa)); return 0; }
結果是 16 。
解释:按順序分配各成員內存,double 佔用的空間最大為8個字節,為d分配完後,c的偏移量为8,是char占用的一个字节的整数倍,則直接分配一個字節給c,最後的 i 偏移量為9,不是int的整數倍,則自動填充3個字節到12,再分配4個字節給i。這樣一共佔用空間: 8 + 1 + 3 + 4 = 16 字節,恰好它也是佔用最大空間成員double的整數倍,故此結構體佔用16個字節。
如果將A的成員聲明順序改一下:
struct A { char c; double d; int i; }aa;
結果變成了24。
解釋:分配完一個字節給 c 後,要填充7個字節偏移達到8才開始為 d 分配內存,分配完後i的偏移為16,可以為i分配內存,分配完後共占 1 + 7 + 8 + 4 = 20 個字節,再填充4個字節到24 為 double 所佔用內存整數倍。
最後再引申一下,看如下例子,分別求各個結構體所占內存:
struct AA { AA(){} ~AA(){} int m1; int m2; }a; struct B { B(){} ~B(){} int m1; char m2; static char m3; }b; struct C { C(){} virtual ~C(){} int m1; int m2; }c;
結果分別是 8,8,12.
解釋:第一個是8無需過多說明;
第二個有一個static靜態變量,由于靜態變量不在對象中分配空間而在專門的靜態區分配空間,因此在結構中不佔用空間,即sizeof(b)仍為8;
第三個涉及到了虛函數,有虛函數的類會使其對象的開頭位置有一個指向虛函數表的指針,該指針占4個字節,故結果為12。
相关文章推荐
- 关于内存分配的几个例子
- 关于struct和union存储的内存字节对齐的问题
- C/C++中关于struct和union的内存对齐原则
- 关于struct和union存储的内存字节对齐的问题
- C/C++中关于struct内存对齐问题
- 关于 struct 和 union 存储时内存边界对齐的问题(二)
- C/C++中关于struct内存对齐问题
- C/C++中关于struct内存对齐问题
- 关于struct的内存对齐问题
- struct/class等内存字节对齐问题详解
- 关于指针和内存的几个问题
- 关于局部变量的指针,栈,和栈的释放的几个例子
- 关于内存对齐的面试题
- 关于c++结构体内存对齐问题
- C++:struct和union 内存字节对齐问题
- 关于结构体内存对齐
- 谈谈关于内存对齐与补齐
- 关于内存对齐
- struct/class/union内存对齐原则
- 关于内存对齐问题(二)