Dayi Lin, Ph.D.

Staff Researcher, AI & Software Engineering

关于对齐规则

笔记
今天小组的群里讨论了关于对齐规则的问题,刚好是我不大熟悉的部分,所以收集了一些资料整理如下:

内存对齐规则:

1)数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始

简单的说就是这样:

Char 偏移量必须为sizeof(char)即1的倍数
int 偏移量必须为sizeof(int)即4的倍数
float 偏移量必须为sizeof(float)即4的倍数
double 偏移量必须为sizeof(double)即8的倍数
Short 偏移量必须为sizeof(short)即2的倍数

举个例子来说明一下:

struct name1{
  char str; //在0偏移处存放,占1字节
  short x;  //原本应在第二个字节处存放(偏移量为1),但是偏移量应为2的整数倍,所以应该加1,
            //在第三个字节处存放(偏移量为2)
  int num;
}
sizeof(struct name1) = 1 + 1 + 2 + 4 = 8
struct name2{
  char str;
  int num; //存放int型,偏移量应为4的倍数,故应在存放了一个字节的char型数据后,再偏移3个字节,
           //存放int型数据
  short x;
}
sizeof(struct name2)=1 + 3 + 4 + 2 = 10 //此处注意,其结果应该为12

这就要提到下一个规则了

2)结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.

由这条规则刊出,上题中struct name2中最大的成员为int,4个字节,结果应是4的整数倍,故为12

还有一条规则,也很重要,我们知道,结构体的成员可以是结构体,那么该如何存储呢?

3)如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

3 Comments on “关于对齐规则”

Leave a Reply

Your email address will not be published. Required fields are marked *