2017-02-07 7 views
-1

私はWindows用のかなり大きなMFCアプリケーションを持っていますが、これは32ビット版のリリース版としてVisual Studioでビルドしたものです。Windows 32ビットmfcアプリケーション用の仮想メモリのアドレス。

私はintインデックスメンバーを持つ私のアプリケーションにいくつかの特別なクラスがあります。そのインデックスは、常にメモリ内のそのオブジェクトのアドレスと同じです。そして、すべて正常に動作します。

しかし、今私は、そのクラスのオブジェクトを含んでいない私のアプリケーションの仮想メモリ内のいくつかの領域を決定する必要があります。 私はデバッガでそれらを見るので、間隔の値は通常非常に低いまたは非常に高いものではありませんが、いくつかの値の周りにあります。セーフティでアドレス0〜10k(0x0000〜0x2710)にその特定のクラスのオブジェクトが含まれていないとすることができますか?そうでない場合は、「安全」なアドレス空間がいくつかありますか?

もしそうでなければ、私は自分自身でダミーのプールを割り当てて他のオブジェクトが作成されないことを確かめることができます。あなたが単一の項目のみが必要な場合

+0

は、別々のヒープを作成し、このクラスの 'オペレータnew'を上書きし、これはあなたが'いくつかのアドレス空間を割り当てるために、 'VirtualAllocの(MEM_RESERVE)を使用することができます – RbMm

+2

このヒープからオブジェクトを割り当てます。あなたがそれを置かない限り、そのアドレススペースには何も入りません。代替:Windowsは、メモリの最下位64KB(0x0000から0xFFFF)にオブジェクトを配置しません。 Windows 8以前では、アプリケーションは手動でオブジェクトを配置するトリックを引き出すことができましたが、Windows 8からはこれも許可されていません。 –

+0

提案されている解決策について質問しています。しかし、あなたは本当に解決しようとしている問題は何ですか? – IInspectable

答えて

2

これは、特定のすべての恐ろしくシステムですが、その制限と一緒に暮らすことができて...

  • 0は動作します。
  • Windowsではメモリの最初の64Kにオブジェクトを配置しないことが保証されているため、65536未満の値は良好です。 (Raymond Chenによるコメントの後に追加された)。
  • コードが "大規模なアドレス空間対応"でコンパイルされていない場合は、0x80000000の後に任意のアドレスを使用できます。 (残念なことに、の場合、32ビットプラットフォームでは1Gが予約されていますが、64ビットプラットフォームではプログラムには予約済みのアドレススペースはありません)。
  • データにアライメント要件があり、32ビットインデックスは、少なくとも4バイトにほぼ整列しています)、アライメントされていない値が機能します。特に、奇妙な値があれば動作します。 (再びRaymond Chenのコメントの後に追加された)。
+1

別のオプション:オブジェクトに位置合わせの要件がある場合は、任意の位置合わせされていない値を選択します。 –

関連する問題