【发布时间】:2017-06-02 20:33:37
【问题描述】:
我正在阅读 Game Coding Complete 第 4 版。有一个关于内存对齐的话题。在下面的代码中,作者说第一个结构非常慢,因为它既不是位对齐也不是字节对齐。第二个不是位对齐的,而是字节对齐的。最后一个很快,因为两者兼而有之。他说如果没有编译指示,编译器会对齐内存本身,这会导致内存浪费。我真的无法得到计算。
这是文本的一部分:-
如果让编译器通过添加未使用的来优化 SlowStruct 字节,每个结构将是 24 个字节,而不是只有 14 个字节。 七 在第一个 char 变量之后填充额外的字节,并且 剩余的字节被添加到最后。这确保了整个 结构总是从 8 字节边界开始。这大约是 40% 浪费的空间,都是由于成员变量的粗心排序造成的。
这是以粗体显示的结论:-
不要让编译器浪费宝贵的内存空间。把你的一些 脑细胞工作并调整您自己的成员变量。
请告诉我计算并更清楚地解释填充概念。
代码:-
#pragma pack(push, 1)
struct ReallySlowStruct
{
char c : 6;
__int64 d : 64;
int b : 32;
char a : 8;
};
struct SlowStruct
{
char c;
__int64 d;
int b;
char a;
};
struct FastStruct
{
__int64 d;
__int b;
char a;
char c;
char unused[2];
};
#pragma pack(pop)
【问题讨论】:
-
既不是位对齐也不是字节对齐。位对齐?我不明白,C 中的最小可寻址地址是一个字节,不是吗?。
-
@KeineLust 我说错了。它未在位边界对齐。
-
@NathanOliver 我正在检查你提供的链接我会看看我是否还有任何疑问。谢谢大家。
标签: c++ c memory memory-management