关于计算struct结构体占用空间
2015-09-26 12:22
435 查看
关于如何计算struct所占用空间的大小:
有人可能觉得不就是把结构体内所有变量所占空间加起来不就可以了吗?其实,这句话只对了一半,所有变量所占空间要加起来没错,但是机器为了更加容易的取出struct里面的数据,会将里面的变量所占空间进行对齐。这是以空间换时间的一种方式。
如何进行对齐呢?
首先,是每个变量的偏移量对齐,每一个变量相对于首地址的位置就是偏移量。例如:
struct data {
int a;//int型变量的大小4个字节
char b;//char类型变量的大小1字节
其次,结构体的大小一定要是所占字节数最大的变量大小的整数倍,有点绕口,举个例子就知道了:
struct data {
int a;//4字节
double b;//8字节
char c;//1字节
int d;//4字节
}在上面的例子中,对每个变量进行偏移量对齐以后算出字节大小是20字节,但是机器为了存取方便一定会在后面加4个字节变为24字节。就像下面这个截图:
有人可能觉得不就是把结构体内所有变量所占空间加起来不就可以了吗?其实,这句话只对了一半,所有变量所占空间要加起来没错,但是机器为了更加容易的取出struct里面的数据,会将里面的变量所占空间进行对齐。这是以空间换时间的一种方式。
如何进行对齐呢?
首先,是每个变量的偏移量对齐,每一个变量相对于首地址的位置就是偏移量。例如:
struct data {
int a;//int型变量的大小4个字节
char b;//char类型变量的大小1字节
double c;//double类型变量的大小8字节
}其中a的偏移量就是0,b的偏移量就是4,c的偏移量就是5,以此类推。要进行对齐的话,该变量的偏移量一定要是该变量大小的整数倍。c的偏移量是5,对齐以后就会变成8,在变量b和c之间会穿插3个字节。这就是每个变量的偏移量对齐了。
其次,结构体的大小一定要是所占字节数最大的变量大小的整数倍,有点绕口,举个例子就知道了:
struct data {
int a;//4字节
double b;//8字节
char c;//1字节
int d;//4字节
}在上面的例子中,对每个变量进行偏移量对齐以后算出字节大小是20字节,但是机器为了存取方便一定会在后面加4个字节变为24字节。就像下面这个截图:
相关文章推荐
- 计算WWW在线人数
- C#使用加边法计算行列式的值
- C#获取文件夹及文件的大小与占用空间的方法
- C#中struct和class的区别详解
- 计算机信息处理
- Lua和C语言的交互详解
- C#中结构体和字节数组转换实现
- C#基于面向过程计算加权平均分的方法
- C#开发的人脸左右相似度计算软件源码分析
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构