【C语言】--- 内存对齐

内存对齐:

结构体内成员按自身长度自对齐,即按他们的起点长度必须是自身长度的整数倍对齐

如在32位系统下,int 型的开始地址必须位0,4,8,······这种整形数据类型长度大小的倍数开始

结构体的总大小必须位有效对齐值的整数倍

有效对齐值的确定:

  1. 当有效对齐值为明确指定时,以结构体内成员的最长者的长度为有效对齐值
  2. 当用#pragma pack(n)指定时,以n和结构体中最长的成员的长度中较小者为其值
  3. 当用attribute ((packed))指定长度时,强制按照此值为结构体的有效对齐值

实例:

struct A {
    char a;  // 1
    char b;  // 1
    char c;  // 1
    };     // 3 有效对齐值为1

struct B {
    int a;  // 4
    char b;  // 1 + (2-1)
    short c;  // 2
 }; //8 有效对齐值为4

struct C {
   char b;  // 1 + (4-1)
   int a;   // 4
   short c; // 2 
}; //12 有效对齐值为4

#pragma pack(2)  // 2<4 有效对齐值为2
struct D {
    char b;  // 1 + (2-1)
    int a;  // 4
    short c; // 2
}; //8

猜你喜欢

转载自blog.csdn.net/Mr_HHHHH/article/details/82114647