#pragma对struct结构体占用字节的计算
一、struct占用字节解释
编译器为了节省计算机读取次数,因为每读一次都需要一次时间,所有需要尽量每次都能高效的读。
优化原则:
1、struct结构体是按照里面成员最大值(下面简称MAX)来作为对其标准的。
2、不够MAX的需要用空占位。
3、比MAX小的成员如果相邻并切和小于等于MAX,则可以相连占位。
struct tmp {
char a;
char c;
short b;
int d;
};
这个struct在用sizeof()计算大小时,结果是8字节。
前面两个char是2个字节,short是2个字节,int4个字节,正好按4字节对齐就是8字节。
为什么要按4字节对其呢??因为这是为了方便计算机在每次读取一个结构时减少读取的次数,这样两次就能读取完这个结构体,并且每次多去都是有效数据。
struct tmp {
char a;
char c;
int d;
short b;
};
sizeof()结果是12。
如果结构体重的位置换一下,换成int的4字节在中间,这样编译器还是为了计算机读取方便,前两个char需要占4字节,后面空两个字节,int占4字节,short也占4字节,这样其实是用空间换时间。1/1/00/1111/11/00
再看一个:
struct tmp {
char a;
char c;
int d;
short b;
long long e;
};
这个sizeof()是多少呢?
答案是24。
char/char/int /short /long long
10 /10 /1111 /11000000/11111111
二、#pragma对struct占字节影响
编译器优化原则:
{这个目前我还没有非常准确的描述,只是按照理解和看到其他人的解释加以整理得到的}
1、每个结构体成员的占位优化规则都是根据#pragma来优化
2、同时也适用原来struct优化的第三条。(请看上面第三条)
直接看例子吧
1)
#pragma pack(2)
struct tmp {
char a;
char c;
short b;
int d;
};
#pragma pack()
这个sizeof()是8,1/1/11/1111,这个刚好前两个char是2,short是2,最后一个int是4字节
换一下位置:
#pragma pack(2)
struct tmp {
char a;
short b;
char c;
int d;
};
#pragma pack()
sizeof() 是2+2+2+4 = 10
10/11/10/1111
这就说明所有成员都是按照2来对齐的,没有管原来的最大长度int是四字节了。
struct tmp {
char a;
short b;
int d;
char c;
};
#pragma pack(1)
struct tmp1 {
char a;
char c;
short b;
int d;
tmp e;
};
#pragma pack()
sizeof(tmp1)的长度是20,这个里面包含了一个tmp e,他的长度是按照tmp自己的对其来的,不会受tmp1的对其方式约束。
#pragma pack(1)
struct tmp {
char a;
short b;
int d;
char c;
};
#pragma pack()
#pragma pack(1)
struct tmp1 {
char a;
char c;
short b;
int d;
tmp e;
};
#pragma pack()
我们在tmp加上一个以1对齐,现在sizeof(tmp1)是16了。三、更多
还有#pragma pack(push,1)与#pragma pack(1)区别问题。
请看其他的博客有很详细的说明了。