通过研究结构,我引出了一个问题,即编译器是如何将结构存储在内存中的,这意味着考虑
struct
{
int number;
char name[nam];
}h;
我想知道的是成员(这里是number
和name
)是如何存储的(它们是按顺序存储还是随机存储,例如,如果number存储在地址2000,而name
存储在2990)?
发布于 2013-12-19 15:43:25
内存按顺序为结构成员分配:
+------------+------------------+-----+-----+-----+-----+-----+-----+
| | ........ | | | | | | |
| | | | | | | | |
+------------+--------+---------+-----+-----+-----+-----+-----+-----+
+ + | name[0] name[nam-1]
+------+-----+ | +------------------+----------------+
| | |
| | |
v v v
number padding name[nam]
但是,与数组不同,为结构分配的内存可能是打包的,也可能不是打包的,即在任何成员的分配空间之后可能有一些填充(但在第一个成员之前不允许填充)。
发布于 2013-12-19 15:44:16
你可以在Data structure alignment中找到答案
数据结构对齐是在计算机内存中排列和访问数据的方式。它由两个独立但相关的问题组成:数据对齐和数据结构填充。当现代计算机读取或写入内存地址时,它将以字大小的块(例如,32位系统上的4字节块)来执行此操作。数据对齐意味着将数据放在等于字大小的某个倍数的内存偏移量处,由于CPU处理内存的方式,这将提高系统的性能。要对齐数据,可能需要在上一个数据结构的末尾和下一个数据结构的开头之间插入一些无意义的字节,这就是数据结构填充。
发布于 2013-12-19 15:44:29
字段将始终按照写入的顺序排列,但它们之间可能会有填充。
https://stackoverflow.com/questions/20685748
复制相似问题