内存对齐

本文详细解析了内存对齐的基本原理及计算规则,并通过多个实例展示了如何使用编译指示来控制内存对齐,从而更好地理解sizeof运算符的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近遇到很多关于计算sizeof的问题,它主要涉及到内存对齐的问题,简单的总结了一下:
  
 
 内存对齐值的计算规则:
 
 1.内存对齐值由编译指示和占用字节数最大的成员两者中较小的值决定;
 2.成员的对齐的顺序就是声明的顺序;
 3.如果一个成员已经对齐完成,占用的空间小于结构体的对齐值,那么下一个成员,当满足一定的条件时,可以不按照
   对齐值进行对齐:上一个设置完成占用的字节数a,下一个成员占用的内存空间字节的数量x,对齐值为p,满足
   p - a >= x;这样可以直接接着上一个成员分配,起始偏移量%x = 0;

    内存对齐的原因:
 1.平台移植
 2.性能

 内存对齐的编译器指示:通过#pragma pack(n) (n = 1, 2, 4, 8, 16)

 实例:

 #pragma pack(1)

struct A
{
 int a;  // 4
 char b;  // 1
 double c; // 8
};

  对齐的值为1,sizeof(A) = 13;

 #pragma pack(2)

struct A
{
 int a;  // 4
 char b;  // 2
 double c; // 8
};

  对齐的值为2,sizeof(A) = 14;

 #pragma pack(4)

struct A
{
 int a;  // 4
 char b;  // 4
 double c; // 8
};

  对齐的值为1,sizeof(A) = 16;

  #pragma pack(8)

struct A
{
 int a;  // 4
 char b;  // 4
 double c; // 8
};

  对齐的值为1,sizeof(A) = 16;

  #pragma pack(16)

struct A
{
 int a;  // 4
 char b;  // 4
 double c; // 8
};

  对齐的值为1,sizeof(A) = 16;

  // 如果结构体的成员也是个结构体
  #pragma pack(8)
  struct B
{
 int a; 
 char b;
 double c;
};

struct A
{
 int a;
 char b;
 double c;
 B d;
};

  sizeof(A) = 4 + 4 + 8 + sizeof(B) = 32

// 如果结构体的成员是个数组
  #pragma pack(8)

struct A
{
 int a;
 char b;
 double c;
 char d[17];
};

sizeof(A) = 4 + 4 + 8 + 17 + 7 = 40

// 如果是个联合体
  #pragma pack(8)

  union DATE
{
    char a;   
    int i[5]; 2 * (int) + 2 * (int) + (int) + 4 = 24
    double b;
};

  sizeof(DATE) = int[5]按照8个字节对齐 = 24

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值