1

考虑以下简单结构:

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

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

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

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

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

4

2 回答 2

5

确实,如果该结构的布局没有填充,那么它可以放置在一个奇数地址,并且它的每个成员都会单独正确对齐。

问题是编译器如何将它放在一个奇怪的地址。可以肯定的是,这可以安排一个自动存储的变量。但是由 分配的堆分配变量malloc呢?遵守的约定malloc是,它必须返回一个内存块,该内存块为任何类型的对象正确对齐。如果malloc有一些对象需要放置在奇怪的地址,则永远无法做到这一点。

于 2013-03-29T15:35:36.537 回答
2

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

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

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

于 2013-03-29T15:49:06.163 回答