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字节
评论(0)
您还未登录,请登录后发表或查看评论