您的位置:首页 > 编程语言 > C语言/C++

[c/c++]class/struct数据在内存中的布局

2014-03-09 14:20 204 查看
注明: 以下内容均为学习内容整理,记录,便于自己学习,并非完全意义上的自产,如有感到不适,请联系我

请看下面两段代码 看似一样 但是得到的结果却不同

struct test1
{
int a;
bool d;
int32_t b;
bool e;
float c;
};

struct test2
{
int a;
int32_t b;
float c;
bool d;
bool e;
};


如果分别对 test1 和test2 执行sizeof 求长度的话那么就会产生两个完全不同的值,前者是20 后者是16。这就牵扯出了struct 和class中的内存布局问题

这个问题的原因是,编译器并不会简单地把结构体内地数据成员紧凑地包裹在一起 而是按照一定地规则去布局。

首先,可以发现地是 test1 中 d 与e 本该是1个字节地,但是在test1地顺序中,却变成了4个字节,这并不是 bool类型真地变成了4个字节,而是编译器为了高效读写数据而对其空位进行地填充(padding)

要理解 为什么要这样填充,我们需要先理解编译器所依照地对齐规则

1.1字节对象,可以置于任何地址

2.2字节对象,可以置于2的倍数地址(地址的LSB为0x0, 0x2,0x4....)

3.4字节对象,可以置于4的倍数地址(地址的LSB为0x0, 0x4,0x8.....)

4.16字节对象,可以置于16的倍数地址 (地址的LSB为0x0)

这么做的原因是因为如果存非对齐的地址读入数据,那么会进行繁杂的 掩码和移位的工作,而对齐的话则不需要

在一个结构体或类中,对齐需求是取其中所有基本类型的成员中的最大对齐需求。

正因为编译器遵循的这个规则,所以编译器会自动的为成员中未达到对齐需求的进行padding操作。如此以来就发生了上面代码中的情况

解决办法也很简单,如上的代码,按顺序对齐就顺利解决了内存浪费的问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: