简单介绍C/C++中结构体内存对齐
2018-03-19 21:04
246 查看
C中结构体的内存规则并不是直接其属性的内存直接相加的,而是有一定规则的,也就是内存对齐规则;
一:结构体中第一个成员的偏移量是0,以后每个成员的位置是x的倍数;//x是各个属性的内存大小
二:成员对齐后,结构体自身也要对齐,按照y的倍数进行;//y是内存最大的属性的内存
比如:
结构体m1中a占1个字节,假设从地址0开始,则c本来会从地址1开始,可是c占4个字节,起始地址不是4的倍数,内存就会把起始地址往后移,也就是说移到地址4后,是4的倍数了,才开始存储c,同理d也是如此;
结构体m2中c占4个字节,假设地址也从0开始,则d会从4开始,可是4不是8的倍数,则移到8开始到地址15,然后a从16开始到地址17,但是17不是结构体属性中最大的属性double内存大小的倍数,所以加到24.
一:结构体中第一个成员的偏移量是0,以后每个成员的位置是x的倍数;//x是各个属性的内存大小
二:成员对齐后,结构体自身也要对齐,按照y的倍数进行;//y是内存最大的属性的内存
比如:
struct m1{ char a; int c; double d; }m1;cout << sizeof(char) << " " << sizeof(int) << " " << sizeof(double) << endl; //结果是1 4 8;可是
cout << sizeof(m1)//结果是16再比如
struct m2{ int c; double d; char a; }m2;
cout << sizeof(m2);//结果是24可以看到结构体的内存大小并不一定等于其属性的内存大小的和,就算属性相同先后次序不同,其结构体大小也可能会不同,这就是因为内存对齐这一机制。
结构体m1中a占1个字节,假设从地址0开始,则c本来会从地址1开始,可是c占4个字节,起始地址不是4的倍数,内存就会把起始地址往后移,也就是说移到地址4后,是4的倍数了,才开始存储c,同理d也是如此;
结构体m2中c占4个字节,假设地址也从0开始,则d会从4开始,可是4不是8的倍数,则移到8开始到地址15,然后a从16开始到地址17,但是17不是结构体属性中最大的属性double内存大小的倍数,所以加到24.
相关文章推荐
- [C++基础]内存对齐(字节对齐,结构体对齐)
- C++中结构体的大小与内存对齐
- 关于C++内存中字节对齐问题的详细介绍
- 关于 内存对齐 && sizeof 的介绍 2 —— 结构体(改)
- C++学习之旅——结构体和联合体的区别,以及数据对齐方式影响内存大小
- 学习笔记-C/C++-结构体与sizeof,内存对齐的题目怎么做
- C/C++结构体内存对齐
- C++ 结构体内存对齐
- C/C++结构体内存对齐
- C/C++结构体读文件失败和内存对齐
- C++学习之旅——结构体和联合体的区别,以及数据对齐方式影响内存大小
- C++ 自定义结构体和类 内存对齐
- c++-结构体内存对齐
- C/C++ 结构体成员在内存中的对齐规则(转载)
- C/C++结构体的内存对齐机制
- 关于C++内存中字节对齐问题的详细介绍
- C#调用C++ 平台调用P/Invoke 结构体--内存对齐方式、union封装【七】
- C++学习笔记(二) bool const 和 #define 结构体内存对齐
- C/C++中结构体与类成员变量在存储上的内存对齐问题
- C++ 获取结构体内存对齐后的每个字段的大小