为什么不消除关于这个结构填充字节的需要?

时间:2013-03-29 15:23:08

标签: c++ visual-studio-2010 visual-c++ padding memory-alignment

考虑以下简单结构:

struct Struct {
public:
  char  a;
  short int b;
  char  c;
};

如果此结构的实例位于偶数(16位对齐)地址,则需要两个填充字节来修复对齐(b和数组中的任何后续实例都是如此。< / p>

但是,实例可以放在奇数地址,然后即使没有填充字节,对齐仍然是正确的。

所以我做了一个测试并观察到Visual C ++ 2010将添加这两个填充字节,这表明它总是将它们放在偶数地址。

为什么VC ++不会将它们放在奇数地址上,每个对象节省2个字节? 有什么我不知道的吗?

2 个答案:

答案 0 :(得分:5)

的确如果那个结构没有填充,那么它可以放在一个奇数地址上,它的每个成员都可以单独对齐。

问题是编译器如何将其置于奇数地址。可以肯定的是,可以安排一个自动存储变量。但是由malloc分配的堆分配变量呢? malloc遵守的合同是它必须返回一个内存块,该内存块适用于任何类型的对象。如果有些对象需要放在奇数地址,malloc就永远不会这样做。

答案 1 :(得分:2)

你可以通过使它看起来像这样来解决这个问题:

struct Struct{
public:
    short int b;
    char a;
    char c;
};

这导致许多编译器上的sizeof(Struct) == 4