2011-12-07 9 views
0

MSVCメモリマネージャには、実行された操作に応じてメモリをマークするためにデバッグビルドで使用する特定の16進コードがあります。これらは文書番号hereです。埋め込み時のヒープのMSVC初期化

特に、コード0xCDCDCDCDは、割り当てられているが初期化されていないヒープメモリをマークするために使用されます。私は次のような構造を持っているとします

struct Test 
{ 
    bool foo; 
    int value; 

    Test() : foo(false), value(0) {} 
}; 

私はこのオブジェクトを割り当てると、私の記憶は、エンディアンが考慮されていない、彼らは次現れるだろうと私は16進数のバイトを書いていることに注意してください(次のようになります。この例の場合)?上記

00 CD CD CD CD 00 00 00 00

00 CD CD CDは、4バイト境界で整列さブール値を表します。最後の3バイトは0xCDです。メモリマネージャがこれらの値をCDに初期化したためです。しかし、実際のブール値の初期化はブール値がマシン上の1バイトしか表さないため、1バイトにしかなりません。

これは正しい動作ですか?

+0

ちょっと好奇心 - なぜあなたは尋ねていますか?なぜあなたはチェックしていないのですか? – littleadv

+0

アラインメントの問題があり、ブール値のメンバの1つが「00 CD CD CD」という値を見ていて、プログラムが最初のバイトを初期化しているだけであることを確認したいからです。四。この場合、なぜ最後の3バイトが0xCD –

+0

@ロバートなのかを説明することができます。アライメント部分の内容に基づいて決めるべきではありません。 –

答えて

3

ただ試してみてください。デバッグランタイムにリンクするには、/MDdなどでコンパイルしてください。 (VS2010では答えは「はい」です)。

+0

Debugビルドの動作を見るのは良い方法ではありません。異常なことは、オプティマイザが起動したときに発生します。 –

+2

@Hans、それは実装定義であり、MSVCのメモリパターンの充填はデバッグランタイムでのみ発生します。動作は最適化されたビルドで同じになります。デバッグランタイムライブラリバイナリは、デバッグランタイムにリンクしている場合にユーザーのコードが最適化されてコンパイルされるため、変更されません。 –

+0

あなたはポイント+1を持っています。 –

1

より速いコードを生成する場合、コードジェネレータが4バイトを書き込むのを止めることは何もありません。あるいは、MSVCコンパイラで一般的な最適化であるmemset()を使用します。しかし、明らかにそれは起こらなかった。いずれの方法も正しいですが、構造体のパディングを読み取ることは未定義の動作です。

関連する問題