1.对齐信息( alignof ) ------ C++对于内存中放置不同类型的数据的对齐信息都有考量---因为有了该对齐信息---可以让CPU很快的找到数据

2.#pragma pack规定的对齐长度,实际使用的规则是:
结构,联合,或者类的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
也就是说,当#pragma pack的值等于或超过所有数据成员长度的时候,这个值的大小将不产生任何效果。
而结构整体的对齐,则按照结构体中最大的数据成员 和 #pragma pack指定值 之间,较小的那个进行。

#pragma pack(4)
#include <iostream>
#include <stdio.h>
using namespace std;

struct Po
{
	int number;
	char ch;
	short number_sh;
	char ch2;
	
};

int main()
{
	Po p ;
	p.ch = 'a';
	p.number_sh = 10;
	p.ch2 = 'c';
	p.number = 12;
	cout << "p    address = " << &p << endl;
	cout << "---------" << endl;
	cout << "show the size of the element : " << endl;
	cout << "p           sizeof  = " << sizeof(p) << endl;
	cout << "p.number    sizeof  = " << sizeof(p.number) << endl;
	cout << "p.ch        sizeof  = " << sizeof(p.ch) << endl;
	cout << "p.number_sh sizeof  = " << sizeof(p.number_sh) << endl;
	cout << "p.ch2       sizeof  = " << sizeof(p.ch2) << endl;
	
	cout << "---------" << endl;
	cout << "show the address of the element : " << endl;
	cout << "p.number     = " << p.number << " at " << &p.number << endl;
	printf("p.ch         = %c  at 0x%p\n",p.ch,&p.ch);
	cout << "p.number_sh  = " << p.number_sh << " at " << &p.number_sh << endl;
	printf("p.ch2        = %c  at 0x%p\n",p.ch2,&p.ch2);

	return 0;
}

上述代码结果如下:

解析:

这个结构体实际占据的内存空间是9字节
结构体之间的对齐,是按照结构体内部最大的成员的长度,和#pragma pack规定的值之中较小的一个对齐的。
所以这个例子中,类之间对齐的长度是min(sizeof(int),4),也就是4。
9按照4字节圆整的结果是12,所以sizeof(Po)是12。

从输出结果可以得到:
number 整型占4字节
ch 字符型占用2字节
number_sh 短整型占2字节
ch2 字符型占4字节

修改:

#pragma pack(2)
struct Po
{
	int number;
	char ch;
	short number_sh;
	char ch2;
};
// 9对应2圆整则为10字节,该结构整体占用10字节