欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

结构体内存对齐

程序员文章站 2022-07-12 16:54:00
...

一.为什么要内存对齐

1.平台原因:
不是所有硬件平台都可以访问任意地址上的任意数据,有些硬件平台只能访问某些地址上的特定类型的数据,否则抛出硬件异常;
2.性能原因:
数据结构(尤其是栈)应该尽可能的的在自然边界上对齐。(原因:为了访问未对齐的内存,处理器需要俩次访问操作;而对齐的内存则只需要一次)
其实从本质上来说:这是一种以空间换取时间的做法

二.对齐规则

32位cpu默认对齐数为4;64位cpu默认对齐数位8
(VS下默认对齐数是8,Linux下没有默认对齐数)
1.结构体的第一个成员永远都对齐到结构体的起始位置处;
2.之后的每一个成员都要放在与自己类型大小相符和的整数倍处;
3.如果出现嵌套了结构体的情况,那嵌套的结构体就对齐到自己成员中最大对齐数的整数倍处开始对齐;
4.结构体的大小一定是自己做大对齐数的整数倍;
5.如果结构体内有成员大小超过默认对齐数大小,则后边的仍然按照默认对齐数来参考对齐。

#include<stdio.h>
struct s
{ 
 int a;
 long long b;
 };
 typedef struct student
 {
  char name;
  int age;
  struct s;//此处嵌套了上边的结构体
  long long address; 
 }stu;
 
 int main()
{
  printf("%d\n",sizeof(stu);//结果为32
  return 0; 
}

这是在VS下测试的结果;其内存排布规则如下图:
结构体内存对齐

三.修改默认对齐数

#pragma pack()//括号内的数字便为修改后的默认对齐数
eg:
#pragma pack(8);//将默认对齐数设置为8

若括号内没有填入数字则表示:取消设置的默认对齐数,还原为系统默认的对齐数。
注意:设置默认对齐数时尽量将其设置为2的整数倍。

四.如何尽量的避免内存对齐所带来的空间浪费

在设计结构体时,尽量地将小的成员放在一起。