C/C++中数据对齐的缺陷
时间:2010-08-23
来源:互联网
class CA {
int a;
short b;
};
class CB : public CA {
short c;
};
上面是C++的类定义例子,sizeof(CA)==8,实际只占6字节;sizeof(CB)==12,实际只需
8字节.
typedef struct CA {
int a;
short b;
} CA;
typedef struct CB {
CA CA;
short c;
} CB;
上面是等效的C例子,sizeof(CA)==8,实际只占6字节;sizeof(CB)==12,实际只需8字节.
为什么不能紧缩排列呢?因为sizeof反映的是数组中个体的大小,所以要求必须是对齐
的倍数,CA是4字节对齐,所以sizeof(CA)==8,sizeof(CB)==12.而结构定义中后续字段
不一定要求>=4的对齐.
现在假设在C/C++中增加一个关键字sizeof1,表示非数组中的结构大小,sizeof1(CA)
==6,sizeof(CA)==8,sizeof和sizeof1是有关联的:
sizeof(CA)=(sizeof1(CA)+align(CA)-1)/align(CA)*align(CA)
现在构造CB时,就可以在sizeof1(CA)后增加字段,结果sizeof(CB)==sizeof1(CB)==8.
http://blog.163.com/coo_bin/
int a;
short b;
};
class CB : public CA {
short c;
};
上面是C++的类定义例子,sizeof(CA)==8,实际只占6字节;sizeof(CB)==12,实际只需
8字节.
typedef struct CA {
int a;
short b;
} CA;
typedef struct CB {
CA CA;
short c;
} CB;
上面是等效的C例子,sizeof(CA)==8,实际只占6字节;sizeof(CB)==12,实际只需8字节.
为什么不能紧缩排列呢?因为sizeof反映的是数组中个体的大小,所以要求必须是对齐
的倍数,CA是4字节对齐,所以sizeof(CA)==8,sizeof(CB)==12.而结构定义中后续字段
不一定要求>=4的对齐.
现在假设在C/C++中增加一个关键字sizeof1,表示非数组中的结构大小,sizeof1(CA)
==6,sizeof(CA)==8,sizeof和sizeof1是有关联的:
sizeof(CA)=(sizeof1(CA)+align(CA)-1)/align(CA)*align(CA)
现在构造CB时,就可以在sizeof1(CA)后增加字段,结果sizeof(CB)==sizeof1(CB)==8.
http://blog.163.com/coo_bin/
作者: pan_0326 发布时间: 2010-08-23
“因为sizeof反映的是数组中个体的大小,所以要求必须是对齐
的倍数”这句话说的最好
sizeof(CA)=(sizeof1(CA)+align(CA)-1)/align(CA)*align(CA)这个公式怎么得到的??
的倍数”这句话说的最好

sizeof(CA)=(sizeof1(CA)+align(CA)-1)/align(CA)*align(CA)这个公式怎么得到的??
作者: pengjianbokobe 发布时间: 2010-08-23
字节对齐应该是为了提高存取效率吧
作者: proghua 发布时间: 2010-08-23
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28