7

我正在使用Game Engine Architecture一书的帮助来开发内存管理器。目前我正在阅读有关内存对齐的信息(在书本和网络中),但我不确定对齐如何正确用于课程。我理解内存对齐的概念(例如,一个 4 字节的数据块应该位于以 0x0、0x4、0x8 或 0xC 结尾的地址)但是在allocateAligned()书中的 -function 处有一条评论说对齐必须是幂两个。如果我有一个有两个int和一个的类charsizeof(classs)告诉我,这个类有 12 个字节大。那么,你会通过 32 作为对齐方式吗?会不会浪费内存,可能会导致碎片化?
我的问题是,如何正确对齐类,您能否更详细地解释一下(如果您想对齐更大的数据块,例如 121 个字节,会发生什么情况)以及对齐更大的块是否有意义(因为如果我被告知正确,处理器在一次调用中仅获取 8 个字节)?

4

2 回答 2

8

类型的对齐永远不能大于类型的大小。这是因为在数组中,元素之间不能有填充。

然而,同样重要的是,类型的对齐可能小于类型的大小。

让我们考虑一下您的类类型:它有三个成员,两个 4 字节整数和一个 2 字节整数。我们假设一个 4 字节整数的对齐是 4 个字节,一个 2 字节整数的对齐是 2 个字节(这很常见)。在这种情况下,您的类类型的对齐方式只有 4 个字节。它可以位于任何 4 字节边界上,并且它的每个成员都将正确对齐。

这就是为什么你的类类型有两个字节的填充:12 可以被 4 整除,但 10 不能。如果你的类没有填充,它的大小只有 10 个字节,并且在一个元素数组中,一半的对象会错位。

于 2013-02-17T19:20:57.303 回答
3

类型的对齐方式可以小于但不能大于其大小。在典型的 32 位实现中,您的

struct X {
    int a;
    int b;
    char c;
};

可能会有sizeof(X) == 12alignof(X) == 4。显然你不能X每四个字节都有一个,因为它们会重叠,但是对齐意味着 , 0x1000,0x10040x1008都是0x100c可能开始一个X.

请注意,返回的类型大小sizeof始终是对齐的倍数,因为sizeof它指定数组元素之间的字节数,并且您不希望数组中的第一个条目对齐但第二个不对齐。

于 2013-02-17T19:24:47.443 回答