struct所占空间的计算
2017-09-15 19:33
190 查看
文章来源:http://blog.csdn.net/p011235/article/details/48750725
关于如何计算struct所占用空间的大小:
有人可能觉得不就是把结构体内所有变量所占空间加起来不就可以了吗?其实,这句话只对了一半,所有变量所占空间要加起来没错,但是机器为了更加容易的取出struct里面的数据,会将里面的变量所占空间进行对齐。这是以空间换时间的一种方式。
如何进行对齐呢?
首先,是每个变量的偏移量对齐,每一个变量相对于首地址的位置就是偏移量。例如:
[cpp] view
plain copy
struct data {
int a;//int型变量的大小4个字节
char b;//char类型变量的大小1字节
[cpp] view
plain copy
double c;//double类型变量的大小8字节
[cpp] view
plain copy
}
其中a的偏移量就是0,b的偏移量就是4,c的偏移量就是5,以此类推。要进行对齐的话,该变量的偏移量一定要是该变量大小的整数倍。c的偏移量是5,对齐以后就会变成8,在变量b和c之间会穿插3个字节。这就是每个变量的偏移量对齐了。
其次,结构体的大小一定要是所占字节数最大的变量大小的整数倍,有点绕口,举个例子就知道了:
[cpp] view
plain copy
struct data {
int a;//4字节
double b;//8字节
char c;//1字节
int d;//4字节
}
在上面的例子中,对每个变量进行偏移量对齐以后算出字节大小是20字节,但是机器为了存取方便一定会在后面加4个字节变为24字节。就像下面这个截图:
关于如何计算struct所占用空间的大小:
有人可能觉得不就是把结构体内所有变量所占空间加起来不就可以了吗?其实,这句话只对了一半,所有变量所占空间要加起来没错,但是机器为了更加容易的取出struct里面的数据,会将里面的变量所占空间进行对齐。这是以空间换时间的一种方式。
如何进行对齐呢?
首先,是每个变量的偏移量对齐,每一个变量相对于首地址的位置就是偏移量。例如:
[cpp] view
plain copy
struct data {
int a;//int型变量的大小4个字节
char b;//char类型变量的大小1字节
[cpp] view
plain copy
double c;//double类型变量的大小8字节
[cpp] view
plain copy
}
其中a的偏移量就是0,b的偏移量就是4,c的偏移量就是5,以此类推。要进行对齐的话,该变量的偏移量一定要是该变量大小的整数倍。c的偏移量是5,对齐以后就会变成8,在变量b和c之间会穿插3个字节。这就是每个变量的偏移量对齐了。
其次,结构体的大小一定要是所占字节数最大的变量大小的整数倍,有点绕口,举个例子就知道了:
[cpp] view
plain copy
struct data {
int a;//4字节
double b;//8字节
char c;//1字节
int d;//4字节
}
在上面的例子中,对每个变量进行偏移量对齐以后算出字节大小是20字节,但是机器为了存取方便一定会在后面加4个字节变为24字节。就像下面这个截图:
相关文章推荐
- union 与struct的空间计算
- union 与struct的空间计算
- 关于计算struct结构体占用空间
- struct的对齐方式及占用空间的计算(转自百度百科)
- struct和union在内存中占用空间大小的计算
- union 与struct的空间计算
- 怎么计算struct结构所占空间?
- 使用sizeof计算内存空间_第2篇
- 0-时间复杂度&空间复杂度的计算
- .NET :如何计算引用类型所占用的空间
- 计算空间内三个基站定位坐标
- 双目视觉下空间坐标计算/双目测距
- z/OS磁盘类型及其空间计算方法
- [转]C++中sizeof(struct)怎么计算?
- VC中struct结构占用的内存空间数
- sizeof计算struct大小
- 数据结构2:算法时间复杂度和空间复杂度的计算
- 收藏的文章:sizeof 计算 struct 大小 由 弗里曼·潘 发表的
- C# 命名空间(namespace),接口(interface),类(class),结构(struct)
- 新手学信息检索4:向量空间模型与相似度计算