开门见山的说
当我们用sizeof去算结构体变量是s1的值时发现
s1所占的空间并不是
char型一个字节+int型4个字节
struct stu
{
char name;
int age;
}s1;
#include<stdio.h>
int main()
{
printf("%d", sizeof(s1));
}
这种情况的原因是结构体体存在内存对齐
首先得掌握结构体的对齐规则:1. 第一个成员在与结构体变量偏移量为 0 的地址处。2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的一个对齐数 与 该成员大小的 较小值 。VS 中默认的值为 83. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
也就是说刚刚的计算规则
不是char型1+int型4
而是再char1后偏移3个字节到第四个字节,再加4个字节
为1+3+4,也就是8了
为什么有内存对齐
1. 平台原因 ( 移植原因 ) :不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。2. 性能原因 :数据结构 ( 尤其是栈 ) 应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。总体来说:结构体的内存对齐是拿空间来换取时间的做法。
修改默认对齐数
#pragma pack() 这个预处理指令,可以改变我们的默认对齐数。
#include<stdio.h>
#pragma pack(1)
struct stu
{
char name;
int age;
}s1;
int main()
{
printf("%d", sizeof(s1));
return 0;
}
同样的结构体,因为将默认对齐数改为1,导致结构体变量所占内存空间不同
结构在对齐方式不合适的时候,我么可以自己更改默认对齐数。
哈,谢谢各位同志的阅读,然后呢如果觉得本文对您有所帮助的话,还给个免费的赞吧
Thanks♪(・ω・)ノ
(期待一下,要是有分享和收藏更好啦