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

Poo*_*ria 1 c++ padding visual-studio-2010 memory-alignment visual-c++

考虑以下简单结构:

struct Struct {
public:
  char  a;
  short int b;
  char  c;
};
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Dav*_*nan 5

确实如果那个结构没有填充,那么它可以放在一个奇数地址上,它的每个成员都可以分别正确对齐.

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