c/c++字节对齐(内存对齐)

原因:不对齐可能在存取效率上有损失

 

两个对齐参数{

*编译器都有一个指定的对齐参数用于 structure, union, and class 成员,在 win32 平台上的编译器都是默认为 8;

*每个内置类型自身也都有一个自己的对齐参数,一般来说这个对齐参数就是 sizeof(具体type) 的值;

}

 

内置/结构体/数组对齐{

*地址对齐是相对于结构的成员来说的,内置类型就没什么对齐不对齐的说法了,结构的成员按照结构中声明的顺序依次排放,对齐的意思是成员相对于结构变量的起始地址的相对对齐,关键是在于相对于结构变量的起始地址的偏移;

*内置类型有效对齐是指它的自身对齐参数和指定对齐参数中较小的那个对齐参数;

*结构类型的有效对齐参数是指它的成员中,有效对齐参数最大的那个值

*数组的有效对齐就是它的元素类型的有效对齐。

}

 

结构体对齐{

*(成员的起始地址相对于结构的起始地址的偏移) % (成员的有效对齐) == 0

*(结构的总大小) % (结构的有效对齐) == 0

*如果无法满足对齐规则的话就填充字节直到满足对齐规则

*结构的总大小也要求符合对齐规则,主要是考虑到了结构体数组的情况,数组的各个成员是紧密排列的,不会有空隙,如果结构总大小满足对齐要求的话那么整个数组就自然满足对齐要求了,如果总大小不满足对齐要求的话,CPU 读取这些数组成员还是要花多余的开销。

}

 

对齐举例:

# pragma pack(16)
struct A{
      char a;
      double b;
};
 //sizeof(A) = 16
# pragma pack(16)
struct A{
      char a;
      short c;
      double b;
};
//sizeof(A) = 16
# pragma pack(16)
struct A{
      char a;
      double b;
      short c;
};
//sizeof(A) = 24
# pragma pack(4)
struct A{
      char a;
      double b;
      short c;
};
//sizeof(A)  = 16
# pragma pack(8)
struct A{
      char a;
      double b;
};
struct B{
int i;
   struct A sa;
int c;
};
//sizeof(A) = 32
# pragma pack(8)
struct A{
      char a;
      double b;
};
struct B{
int i;
int c;
   struct A sa;
};
//sizeof(A) = 24
# pragma pack(4)
struct A{
      char a[9];
      double b;
char c[29];
int d[7];
};
//sizeof(A) = 80

 

你可能感兴趣的:(c/c++字节对齐(内存对齐))