【发布时间】:2020-04-30 00:16:22
【问题描述】:
我在 C 中有结构:
typedef struct Node {
int data; // 4 bytes int + 4 bytes for alignment
struct Node* prev; // 8 bytes pointer
struct Node* next; // 8 bytes pointer
} Node;
这个结构的大小是 24 字节 (8 + 8 + 8)。当我使用 sizeof(Node) 时,编译器也会显示 24 个字节。
但是,当我在堆上(一个接一个)创建两个或多个结构并查看它们的内存位置时,每个 Node 结构之间存在 8 个字节间隙。 例如:
11121344 (the 1st Node address)
11121376 (the 2nd Node address) // 376-344 = 32-24 = 8 extra bytes
11121408 (the 3rd Node address) // 408-376 = 32-24 = 8 extra bytes
你能解释一下为什么编译器通过在 Node 之间添加 8 个字节来分隔 Node 结构吗?
【问题讨论】:
-
我猜原因是结构字对齐。它有利于内存访问。
-
如果你在堆上创建它们,那么所有的赌注都与它们分配的内存地址有关。
-
秘诀在于你是如何“创建两个或更多结构”的。这是一个数组吗?如果不是,为什么期望内存地址之间有任何东西?
-
malloc(sizeof(Node) * 3)是一个由 3 个结构组成的数组,其中您期望某些相对地址。malloc(sizeof(Node)); malloc(sizeof(Node)); malloc(sizeof(Node));是 3 个完全不相关的对象,每个对象都可以在任何地方。 -
Malloc 也在使用一些内存来进行内部簿记(有时还使用金丝雀来检测损坏)。有几种可能的策略,其中一些可能会以这种方式显示出来。