c++对齐方式总结(上)
来源:互联网 发布:自媒体发展的数据 编辑:程序博客网 时间:2024/05/20 13:36
发现从网上获得的这些信息上受益匪浅,同时感慨人家怎么那么牛,不仅技术牛,而且文章写的也好呢!真是自叹不如,同时也想实践一下,记录一下自己的学习心得,练练自己的文笔,不求能帮得上大家,但求能在这个网上结识一些朋友,大家互相学习,共同进步
编译器要对c++代码进行编译时需要按照相应的类型为变量分配内存空间,最为人们熟知的就是那五个空间了:栈,堆,全局数据区,常量区和代码区。现在知道了哪些变量存放在哪些空间里了,但是在相应的空间里又是如何存放的呢?相信很多人都已经知道了,我也知道了。
对齐方式有三种规则,看网上已经很详细了,我还是想用自己的话再说一遍吧:
下面用网上的例子和我的改进加以说明
试验:通过#pragma pack(n)改变“对齐系数”,然后察看sizeof(struct test_t)的值。
1字节对齐(#pragma pack(1))
输出结果:sizeof(struct test_t) = 8
分析过程:
1) 成员数据对齐
#pragma pack(1)
struct test_t {
int a; /* 长度4 > 1 按1对齐;起始offset=0 0%1=0;存放位置区间[0,3] */
char b; /* 长度1 = 1 按1对齐;起始offset=4 4%1=0;存放位置区间[4] */
short c; /* 长度2 > 1 按1对齐;起始offset=5 5%1=0;存放位置区间[5,6] */
char d; /* 长度1 = 1 按1对齐;起始offset=7 7%1=0;存放位置区间[7] */
};
#pragma pack()
成员总大小=8
2) 整体对齐
整体对齐系数 = min((max(int,short,char), 1) = 1
整体大小(size)=$(成员总大小) 按 $(整体对齐系数) 圆整 = 8 /* 8%1=0 */ [注1]
2字节对齐(#pragma pack(2))
输出结果:sizeof(struct test_t) = 10
分析过程:
1) 成员数据对齐
#pragma pack(2)
struct test_t {
int a; /* 长度4 > 2 按2对齐;起始offset=0 0%2=0;存放位置区间[0,3] */
char b; /* 长度1 < 2 按1对齐;起始offset=4 4%1=0;存放位置区间[4] */
short c; /* 长度2 = 2 按2对齐;offset 需要按照原则1自增,直到起始offset=6 6%2=0;存放位置区间[6,7] */
char d; /* 长度1 < 2 按1对齐;起始offset=8 8%1=0;存放位置区间[8] */
};
#pragma pack()
成员总大小=9
2) 整体对齐
整体对齐系数 = min((max(int,short,char), 2) = 2
整体大小(size)=$(成员总大小) 按 $(整体对齐系数) 圆整 = 10 /* 10%2=0 */
4字节对齐(#pragma pack(4))
输出结果:sizeof(struct test_t) = 12
分析过程:
1) 成员数据对齐
#pragma pack(4)
struct test_t {
int a; /* 长度4 = 4 按4对齐;起始offset=0 0%4=0;存放位置区间[0,3] */
char b; /* 长度1 < 4 按1对齐;起始offset=4 4%1=0;存放位置区间[4] */
short c; /* 长度2 < 4 按2对齐;起始offset=6 6%2=0;存放位置区间[6,7] */
char d; /* 长度1 < 4 按1对齐;起始offset=8 8%1=0;存放位置区间[8] */
};
#pragma pack()
成员总大小=9
2) 整体对齐
整体对齐系数 = min((max(int,short,char), 4) = 4
整体大小(size)=$(成员总大小) 按 $(整体对齐系数) 圆整 = 12 /* 12%4=0 */
- c++对齐方式总结(上)
- 字节对齐和C/C++函数调用方式学习总结
- 字节对齐和C/C++函数调用方式学习总结
- 字节对齐和C/C++函数调用方式学习总结
- 字节对齐和C/C++函数调用方式学习总结
- 字节对齐和C/C++函数调用方式学习总结 - [C/C++]
- c++对齐方式总结(下)
- HTML 水平对齐方式总结
- c语言中的对齐方式
- C语言对齐方式探讨
- C语言字节对齐方式
- C/C++数据对齐方式
- 总结面试时没有回答上的设置内存对齐方式问题
- C/C++数据对齐总结
- C/C++ 字节对齐 总结
- c/c++内存对齐总结
- UILabel对齐方式 距上 居左 对齐
- UILable的对齐方式(上对齐,下对齐,默认只能中间对齐)
- [Flash/Flex] 图片显示效果:下落
- 通过JFileChooser完成文件的拷贝
- 解决VC++与VS冲突造成具体做法如下:(英文原文文章和FileTool.exe都在附件里了)无法打开文件和无法向工程中添加文件的问题
- UltraEdit 快捷键操作
- 编写一个程序,打印输入中单词长度的直方图。水平方向的直方图比较容易
- c++对齐方式总结(上)
- wsprintf不支持%f的解决方法
- 简单的界面换肤术----Swing
- 网站设计的全过程12步
- with check option
- Google的拍照功能疑问?
- Android核心模块
- 网站打开首页时如何读取数据库里面的数据
- dojo未定义