您的位置:首页 > 其它

关于 Struct 内存对齐的几个例子

2013-06-29 19:09 731 查看
例子主要是求一個具體的 struct 占幾個字節。

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: