我正在使用本书Game Engine Architecture的帮助来处理内存管理器。
目前我正在阅读关于内存对齐的内容(在书和网页中),我不确定如何正确地使用对齐类。我理解内存对齐的概念(例如,一个4字节数据块应该位于以0x0,0x4,0x8或0xC结尾的地址)但是在allocateAligned()
- 本书中的函数是一条注释,表示对齐必须是两个的力量。如果我的课程有两个int
和一个char
,sizeof(classs)
告诉我,该课程大12字节。那么,你会通过32作为对齐吗?这不是浪费记忆,也可能导致分裂吗?
我的问题是,如何正确地对齐类,你能解释一下它更详细(如果你想对齐更大的数据块会发生什么,比如121字节),并且更大的块被对齐是否有意义(因为如果我正确通知,处理器在一次调用中只获取8个字节?
答案 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) == 12
和alignof(X) == 4
。显然,每四个字节不能有X
,因为它们会重叠,但对齐意味着0x1000
,0x1004
,0x1008
和0x100c
是可能开始X
的所有潜在地点。
请注意,sizeof
返回的类型大小始终是对齐的倍数,因为sizeof
指定了数组元素之间的字节数,并且您不希望第一个条目在数组要对齐但不是第二个。