类的内存对齐

时间:2013-02-17 19:16:38

标签: c++ memory-management memory-alignment

我正在使用本书Game Engine Architecture的帮助来处理内存管理器。 目前我正在阅读关于内存对齐的内容(在书和网页中),我不确定如何正确地使用对齐类。我理解内存对齐的概念(例如,一个4字节数据块应该位于以0x0,0x4,0x8或0xC结尾的地址)但是在allocateAligned() - 本书中的函数是一条注释,表示对齐必须是两个的力量。如果我的课程有两个int和一个charsizeof(classs)告诉我,该课程大12字节。那么,你会通过32作为对齐吗?这不是浪费记忆,也可能导致分裂吗? 我的问题是,如何正确地对齐类,你能解释一下它更详细(如果你想对齐更大的数据块会发生什么,比如121字节),并且更大的块被对齐是否有意义(因为如果我正确通知,处理器在一次调用中只获取8个字节?

2 个答案:

答案 0 :(得分:8)

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

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

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

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

答案 1 :(得分:3)

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

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

可能会有sizeof(X) == 12alignof(X) == 4。显然,每四个字节不能有X,因为它们会重叠,但对齐意味着0x10000x10040x10080x100c可能开始X的所有潜在地点。

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