同城快递,畸胎瘤,10-阿荣,我是阿荣,我为自媒体代言,独立撰稿

admin 2019-05-20 阅读:189

咱们运用的电子计算机绝大部分都是冯·诺依曼结构的机器,遵从“存储程序”的概念。数据处理以存储为条件,在编程中数据怎么“存得进去,获得出来”,而且契合空间、时刻功率的要求,在考虑数据结构和算法时,都要有明晰的内存映像的图景。

你能够想像在界说一个结构体时,便是在构建一块内存空间的架构。当界说结构体变量时,就会实践分配内存空间,这块内存空间的首地址便是结构体变量的称号,各成员变量名对应各小块空间的首地址。拜访各成员变量运用的点号,就如同是大块空间的地址到成员空间的映射或偏移。

如以下界说的结构体:

#include
struct Readout {
char hour;
int value;
char seq;
}testSize;
void main()
{
std::cout<
}

你可能会想到以下的内存映像图景(以下都是假定32位,int类型占用4个字节长度的机器):

可能会以为以下代码的输出应该是6(各成员巨细的和)。

std::cout<

但实践的输出却是12。这便是结构体的内存对齐,编译器会主动对齐结构体数据成员以进步运转功率。

结构体的字节对齐是指编译器在为结构体变量分配内存时,确保下一个成员的偏移量为成员类型的整数倍。因而,关于一些结构体变量来说,其巨细并不等于结构体中每一个成员巨细的总和。编译器根据功率要素添加一些额定字节以使存储鸿沟对齐。

这样会在内存中留下一些“空泛”而添加了内存空间的占用:

这也就解说了内存空间占用是12而不是6的原因。

您能够经过简略地按巨细(首先是最大的成员)对成员排序来最小化糟蹋的空间。

struct Readout {
int value;
char hour;
char seq;
}testSize;
void main()
{
std::cout<
}

此刻的内存占用是8个字节:

也便是说,由于对齐的原因,仍是留下了一些内存“空泛”。

如果是以下结构界说,size也是8:
struct Readout {
char hour;
char seq;
int value;
}testSize;

经过以下句子能够强制地声明结构体内存对齐的长度,如:

#pragma pack(1) //C编译器按n字节对齐。

如果有声明以上句子,则下面句子的输出便是6了:

std::cout<

根本的规则是:

结构体每个成员相关于结构体首地址的偏移量(offset)都是成员巨细的整数倍,如有需求,编译器会在成员之间加上填充字节;

结构体的总巨细为结构体最宽根本类型成员巨细的整数倍,如有需求编译器会在在最末一个成员之后加上填充字节。

-End-