关于内存对齐的思考 Shepard-Wang

今天在看联合时,想到了既然联合和结构体这么相似,那它有没有内存对齐问题,一查,果然是有的。网上给出的一个例子引起了我的兴趣:

typedef union
{
  char a;
  int b[5];
  double c;
}u;

来源:https://blog.csdn.net/u013400743/article/details/50937313

结构体内有数组的内存对齐问题我们之前并未讨论过,在计算这个问题时,数组的对齐数应该如何取?按照数组的数据类型 int 计算还是数组整体的大小?我们不妨在程序中运行一下,得出了结论:

#pragma pack(8)
#include<stdio.h>

typedef union
{
	char a;
	int b[5]; // 4 与 8 取较小值
	double c; // 最终总大小为最大对齐数的整数倍
}u;//24

struct s {
	char a;
	int b[5];
	double c;
}s1; // 32


int main(void) {

	size_t u1 = sizeof(u);
	size_t s1 = sizeof(struct s);

	return 0;
}

VS 中我们设置默认对齐数为 8 ,数组类型的成员的对齐数按照数组的数据类型和默认对齐数取较小值,而不是用整个数组大小和默认对齐数取较小值