1

次の単純な構造を検討してください。

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

この構造体のインスタンスが偶数 (16 ビットでアラインされた) アドレスに配置されている場合、アラインメントを修正するために 2 つのパディング バイトが必要です (b配列内の後続のインスタンスに対しても)。

ただし、インスタンス奇数アドレスに配置される可能性があり、パディング バイトがなくてもアラインメントは正しくなります。

そこで私はテストを行い、Visual C++ 2010 がこれら 2 つのパディング バイトを追加することを観察しました。これは、常に偶数アドレスに配置されることを示しています。

オブジェクトごとに 2 バイトを節約して、なぜ VC++ はそれらを奇数のアドレスに配置しないのでしょうか? 私が気づいていないことはありますか?

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 に答える