C++变量对齐
来源:互联网 发布:创维电视怎么连接网络 编辑:程序博客网 时间:2024/04/30 20:34
编译器要对c++代码进行编译时需要按照相应的类型为变量分配内存空间,最为人们熟知的就是那五个空间了:栈,堆,全局数据区,常量区和代码区。现在知道了哪些变量存放在哪些空间里了,但是在相应的空间里又是如何存放的呢?相信很多人都已经知道了,我也知道了。
对齐方式有三种规则,看网上已经很详细了,我还是想用自己的话再说一遍吧:
1. 数据成员对齐规则: 为类,结构体或联合体分配内存时,首先可以确定这些对象的首地址,类、结构体或联合体的的成员变量在内存从相对于首地址的offset=0处开始分配内存,分配时遵循如下原则:比较这个变量的类型所占字节数m和#paragma pack(n)中指定的n的大小。求得较小值,变量偏移应该为该值的整数倍。
2. 结构(或联合)的整体对齐规则: 在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
3. 含有对象组合的对齐规则:各个基本类型成员的对齐方式是不变的,遇到对象的情况下,要在符合这个对象中各个数据类型的字节数的公倍数进行对齐,否则,可能会导致对象内部不对齐。
下面用网上的例子和我的改进加以说明试验:通过#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++中结构体与类成员变量在存储上的内存对齐问题
- GCC结构体内变量对齐
- [C] 结构对齐
- C中的内存对齐
- C/C++字节对齐
- C/C++字节对齐
- c/c++字节对齐
- C/C++内存对齐
- C/C++字节对齐
- C/C++内存对齐
- C 语言数据对齐
- 基于Discuz的原生态MVC框架Uxf
- 歌德巴赫猜想
- linux 端口映射
- java 基础4 特性 封装 继承 多态
- ANR
- C++变量对齐
- vsftp配置指南
- note : make a class, use wininet api upload http file
- Linux MBR
- MiniUI - 快速开发WebUI
- 【JS】angular和require的区别
- 黑马程序员 Java基础学习笔记5 类
- wget 1.13.4 移植到嵌入式ARM上的过程
- Linux 下载文件命令