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类型的情况。
操作系统: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类型的情况。
相关文章推荐
- 九度OJ 1172:哈夫曼树 (贪心)
- IP对象InetAddress
- Android工程导入时常见的错误解决方法
- Openstack kvm win7镜像制作(转)
- 快速入门:十分钟学会Python(转)
- Execution failed for task ':app:dexDebug'.
- Hibernate Many-to-Many Bidirectional mapping
- 九度OJ 1172:哈夫曼树 (贪心)
- ADO接口操作数据库
- Android 视频播放的三种方法
- 在Linux服务器上安装使用Memcache
- 使用超链接提交中文参数时的乱码问题
- iOS-UIKit( UILabel.h - -解读)
- Android教程 -07 Activity的任务栈和启动模式
- Unity5.0标准资源包
- 表单单选按钮
- Android教程 -07 Activity的任务栈和启动模式
- pthread_cond_timedwait 实例
- 《写自己的框架6》:自定义规则引擎,适应不断变化的业务场景
- oracle ho与mysql system命令