您的位置:首页 > 其它

struct内存安排

2015-10-26 10:06 274 查看
处理器:AMD x64

操作系统:win7

编译器:GCC 4.8.1

该条件下,char---1byte int---4bytes double---8bytes

本内容为我试验得到,所以会因为不同的试验平台等,还有试验设想的条件不全而出现结果会有偏差。

结论:不考虑位域(位域就是可以以bit为单位精确指定位数)情况,struct里面的内存安排,会根据里面的最大基本存储类型为单位增加。

当增加一个单位后,后面的数据如果没有填满就不会增加存储大小。

下面举几个例子。

1.两个char

struct test

{

char c1;

char c2;

};

大小为2bytes

2.一个int,一个char

struct test

{

int i;

char c;

};

大小为8bytes

3.一个double,一个char

struct test

{

double d;

char c;

};

大小为16bytes

4.一个double,一个char,一个int

struct test

{

double d;

char c;

int i;

};

大小为16bytes

5.一个char,一个double,一个int

struct test

{

char c;

double d;

int i;

};

大小为24bytes

注:①由3和4对比可知,当分配了一个等于结构体之内最大基本类型的内存大小之后,后面的会先试着填满,当填满之后再增加结构体内存大小。

②由4和5对比可知,这个是与顺序有关的,首先结构体里面有double,所以最小分配8bytes。即使是char变量c

然后有一个double d,虽然还有7bytes没用,但是double需要8bytes,所以又分配8bytes

然后来一个int,所以再分配8bytes。

总共24bytes。

继续试验

6.一个自定义类型(包含2个double),一个char

class A

{

private;

double x;

double y;

}

struct test

{

A a;

char c;

}

大小为24bytes

7.一个double类型数组,一个char

struct test

{

double d[2] = {0.1, 0.2};

char c;

}

大小为24bytes

8.一个自定义类型(包含一个double,一个int),一个char

class A

{

private;

int x;

double y;

}

struct test

{

A a;

char c;

}

大小为24bytes,这个24bytes是不管class A中是先声明int还是double,也不管struct中是先声明class A,还是先声明char

注:①由后面的试验可知,虽然类或者符合结构作为一个整体是有很多字节,但是struct分配的最小内存空间仍然是以符合类型或者自定义类型中的最大基本类型为单位的。

②但是由于class类作为一个对象,分配了内存空间之后,其他对象是不会在它后面填充的了。

后续的试验:

1.类继承的情况。

2.c++标准容器的情况。

3.bool类型的情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: