【发布时间】:2013-03-29 23:57:12
【问题描述】:
考虑以下简单结构:
struct Struct {
public:
char a;
short int b;
char c;
};
如果此结构的实例放置在偶数(16 位对齐)地址,则需要两个填充字节来修复对齐(@987654323@ 和数组中的任何后续实例)。
但是,实例可以放置在奇数地址,然后即使没有填充字节,对齐仍然是正确的。
所以我做了一个测试,发现 Visual C++ 2010 会添加这两个填充字节,这表明它总是将它们放在偶数地址。
为什么 VC++ 不将它们放置在奇数地址,每个对象节省 2 个字节? 有什么我不知道的吗?
【问题讨论】:
-
我尝试解析下面的句子,但在两次尝试后放弃了:对齐的内存访问将适用于其中的每个成员,即使它们有一个数组并且每个对象的大小为 4 个字节,但如果它们总是放置在偶数地址,则需要向对象添加两个填充字节以允许对齐的内存访问使其大小为 6 并增加了 2。
-
我不太确定你在问什么,但如果问题是如何摆脱该结构中的填充,你可以在定义之前添加语句
#pragma pack(1);这应该将大小更改为4。 -
正确对齐元素可能会提高性能,但会浪费一些空间。编译器如何知道您想节省空间但不关心性能?你有十亿条记录,所以空间很重要吗?
-
@BoPersson 问题是为什么编译器不选择实现这两个目标的解决方案。
标签: c++ visual-studio-2010 visual-c++ padding memory-alignment