内存对齐总结
来源:互联网 发布:ubuntu svn库创建 编辑:程序博客网 时间:2024/06/05 09:20
gcc貌似默认按4对齐
#pragma pack(n),n=1,2,4,8,16可以改变对齐方式
struct A{ double l; int i; int b; char c;};
32位系统:double 8字节 int 4字节 char 1字节
结构体A所在字节为8+4+4+8=24。原因double占8字节,两个int刚好占8字节,char按8字节对齐
gcc下字节数为8+4+4+4=20。因为gcc默认按4字节对齐,char不够4字节补足4字节而不是8
struct A{ int l; int i; int b; char c;};
对结构体做如上修改,double改为int,由于最大占4字节,所以char按4字节补齐,而不是8字节。
struct A{ double l; int i; int b;};struct B{ int i; double l; int b;};
A所占字节为8+4+4=16,B所占字节为8+8+8=24。因为A中两个int在double之后,在分配内存时刚好能分配8字节内存。在B中double在两个int之间,而double所占字节数大于int,因此将int按8字节对齐。
在32位系统中指针占4字节(4*8=32),64位系统中指针占8字节(8*8=64)。
#pragma pack(n)
#pragma pack(1)struct A{ bool l; int b; double i;};
按1字节对齐,可以直接计算,1+4+8=13
#pragma pack(2)struct A{ bool l; int b; double i;};
按2字节对齐,分配的内存为2的倍数,bool补满2字节,2+4+8=14
#pragma pack(8)struct A{ bool l; int b; double i;};
按8字节对齐,2+4<8,8+8=16
结构体中有结构体的情况
struct A{ int i; double j;};struct B{ A a; int i;};
此时B大小为24,计算B时由于A此时是按8字节对齐,而i只占4字节,因此B中按8字节对齐
struct A{ int i; bool j;};struct B{ A a; double j;};
再看个例子,A按4字节对齐,占8字节,B中double占8字节,比A的对齐方式大,因此A a按8字节对齐double j。sizeof(B)=16
- 内存字节对齐总结
- 内存字节对齐总结
- 内存对齐总结
- ARM 内存对齐总结
- ARM 内存对齐总结
- C++内存对齐总结
- ARM 内存对齐总结
- 关于内存对齐的总结
- 有关-内存对齐-的总结
- 关于内存对齐的总结
- 内存结构体对齐总结
- c/c++内存对齐总结
- C中内存对齐的总结
- 关于内存对齐的总结1
- 关于内存对齐的小总结
- 关于内存对齐的小总结
- 内存字节对齐原则——总结
- 关于内存对齐的一些总结
- 【初学】Objective-C学习笔记-Objectiv-C
- Android能够获取到唯一的设备ID吗?
- Twitter创始人Jack Dorsey的每日必做和不做清单
- CURL 远程网络服务器日志传输失败的错误代码列表
- 【GUI编程之准备--2】wxWidgets编写HelloWorld
- 内存对齐总结
- UITableViewController
- 方兴未艾的计算广告学——微软亚洲研究院高级研究员 刘铁岩
- Oracle 取前10条记录
- iOS多线程的初步研究(七)-- dispatch对象
- 动态规划之Help Jimmy
- 用java导入导出excel如何去掉软回车和硬回车
- J2EE配置文件加密
- 高性能 Windows Socket 组件 HP-Socket v2.3.1-beta-1 发布