考虑以下简单结构:
struct Struct {
public:
char a;
short int b;
char c;
};
如果此结构的实例位于偶数(16位对齐)地址,则需要两个填充字节来修复对齐(b
和数组中的任何后续实例都是如此。< / p>
但是,实例可以放在奇数地址,然后即使没有填充字节,对齐仍然是正确的。
所以我做了一个测试并观察到Visual C ++ 2010将添加这两个填充字节,这表明它总是将它们放在偶数地址。
为什么VC ++不会将它们放在奇数地址上,每个对象节省2个字节? 有什么我不知道的吗?
答案 0 :(得分:5)
的确如果那个结构没有填充,那么它可以放在一个奇数地址上,它的每个成员都可以单独对齐。
问题是编译器如何将其置于奇数地址。可以肯定的是,可以安排一个自动存储变量。但是由malloc
分配的堆分配变量呢? malloc
遵守的合同是它必须返回一个内存块,该内存块适用于任何类型的对象。如果有些对象需要放在奇数地址,malloc
就永远不会这样做。
答案 1 :(得分:2)
你可以通过使它看起来像这样来解决这个问题:
struct Struct{
public:
short int b;
char a;
char c;
};
这导致许多编译器上的sizeof(Struct) == 4