教你5分钟轻松搞定内存字节对齐
写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢?讲讲字节对齐吧.
如果体系结构是不对齐的,A中的成员将会一个挨一个存储,从而sizeof(a)为11。显然对齐更浪费了空间。那么为什么要使用对齐呢?
体系结构的对齐和不对齐,是在时间和空间上的一个权衡。对齐节省了时间。假设一个体系结构的字长为w,那么它同时就假设了在这种体系结构上对宽度为w的数据的处理最频繁也是最重要的。它的设计也是从优先提高对w位数据操作的效率来考虑的。比如说读写时.............此处省略50万字
上面是你随便google一下,人家就可以跟你解释的,一大堆的道理,我们没怎么多时间,讨论为何要对齐.直入主题,怎么判断内存对齐规则,sizeof的结果怎么来的,请牢记以下3条原则:(在没有#pragmapack宏的情况下,务必看完最后一行)
等你看完此3条原则,2分钟已经过去,抓紧时间,实战3分钟:
typedefstructbb
{
intid; //[0]....[3]
doubleweight; //[8].....[15] 原则1
floatheight; //[16]..[19],总长要为8的整数倍,补齐[20]...[23] 原则3
}BB;
typedefstructaa
{
charname[2]; //[0],[1]
int id; //[4]...[7] 原则1
doublescore; //[8]....[15]
shortgrade; //[16],[17]
BBb; //[24]......[47] 原则2
}AA;
intmain()
{
AAa;
cout<<sizeof(a)<<""<<sizeof(BB)<<endl;
return0;
}
结果是
4824
ok,上面的全看明白了,内存对齐基本过关.
再讲讲#pragmapack().
在代码前加一句#pragmapack(1),你会很高兴的发现,上面的代码输出为
3216
bb是4+8+4=16,aa是2+4+8+2+16=32;
这不是理想中的没有内存对齐的世界吗.没错,#pragmapack(1),告诉编译器,所有的对齐都按照1的整数倍对齐,换句话说就是没有对齐规则.
那#pragmapack(2)的结果又是多少呢?对不起,5分钟到了,自己去测试吧.
相关文章
- 使用zabbix监控redis内存使用
- Linux内存管理:memblock
- 【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )
- 清理Linux内存:释放系统资源(清理内存linux)
- Redis:精选的内存数据库(redis内存数据库)
- 利用Redis让内存数据库发挥最大威力(redis内存数据库)
- 管理你的数据:Redis 内存数据库(redis内存数据库)
- Redis内存分配的实现及其优化策略(redis内存分配)
- Redis读写操作简介:快速高效的内存数据库(redis读写)
- Oracle 提升内存运算效率(oracle 内存运算)
- Oracle内存参数限制及其管理(oracle内存参数限制)
- 内存只用单台机器,Redis能达到最大内存(单台redis最大)
- 利用磁盘存储解决方案Redis释放内存的威力(基于磁盘redis)