我正在使用Game Engine Architecture这本书的帮助来开发一个内存管理器。目前,我正在阅读关于内存对齐的文章(在书中和web中),我不确定如何在类中正确使用对齐。我理解内存对齐的概念(例如,4字节的数据块应该位于以0x0、0x4、0x8或0xC结尾的地址),但在书中的allocateAligned()-function中有一条评论说对齐必须是2的幂。如果我有一个有两个int和一个char的类,sizeof(classs)告诉我,这个类有12个字节大。那么,你会传递32作为对齐吗?这会不会浪费内存,并可能导致碎片?
我的问题是,类如何正确地对齐,你能给我解释得更详细些吗(如果你想对齐更大的数据块,比如121字节,会发生什么),对更大的数据块进行对齐有意义吗(因为如果我得到的信息正确的话,处理器在一次调用中只获取8个字节)?
发布于 2013-02-18 03:20:57
类型的对齐方式永远不能大于类型的大小。这是因为在数组中,元素之间不能有填充。
但是,同样重要的是,类型的对齐方式可能比类型的大小更小。
让我们考虑一下您的类类型:它有三个成员,两个4字节的整数和一个2字节的整数。让我们假设4字节整数的对齐方式是4字节,而2字节整数的对齐方式是2字节(这很常见)。在这种情况下,类类型的对齐方式只有4个字节。它可以位于任何4字节的边界上,并且它的每个成员都将正确对齐。
这就是为什么你的类类型有两个字节的填充: 12可以被4整除,但10不能。如果您的类没有填充,它的大小将只有10个字节,并且在元素数组中,一半的对象将未对齐。
发布于 2013-02-18 03:24:47
类型的对齐方式可以小于但不大于其大小。在典型的32位实现中,您的
struct X {
int a;
int b;
char c;
};可能会有sizeof(X) == 12和alignof(X) == 4。显然,您不能每四个字节都有一个X,因为它们会重叠,但是对齐意味着0x1000、0x1004、0x1008和0x100c都是您可以开始X的潜在位置。
请注意,sizeof返回的类型大小始终是对齐的倍数,因为sizeof指定了数组元素之间的字节数,而您不希望对齐数组中的第一个条目而不是第二个条目。
https://stackoverflow.com/questions/14924998
复制相似问题