C语言:结构体内存对齐

结构体内存对齐即计算结构体的大小

首先,我们需要知道为什么要内存对齐?
1.平台原因:不是所有的硬件平台都能访问任意地址上的任意数据;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出异常
2.性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于:为了访问未对齐的内存,处理器需要做连词给内存访问;而对球队的内存访问仅需要一次访问。

  • 内存对齐是拿空间换时间的做法
  • 两种结构体即便内容完全一样,在C编译器看来,是两种类型

怎么计算?(内存对齐规则)

举个栗子:

struct a
{
 char c;//1
 int x;//4
};
struct b
{
 int x;//4
 double c;//8
};
int main()
{
 printf("struct a:%d\n", sizeof(struct a));//8
 printf("struct b:%d\n", sizeof(struct b));//16
 system("pause");
 return 0;
}

在这里插入图片描述
结构体内存对齐规则:
1.第一个成员在与结构体变量偏移量为0的地址处(也就是第一个元素不需要对齐)
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处
3.结构体的总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍
解释:

  • 对齐:放入特定变量的起始偏移量,如果能整除对齐数,则为对齐
  • 对齐数是默认自身的大小
  • 不对齐调整起始偏移量,保证起始偏移量能整除自身对齐数的最小值
发布了73 篇原创文章 · 获赞 2 · 访问量 2866

猜你喜欢

转载自blog.csdn.net/weixin_43219708/article/details/103624298