x86-64命令セットは、実行可能コードを合理化するのに役立つレジスタおよびその他の改良を追加します。しかし、多くのアプリケーションでは、増加したポインタサイズは負担です。すべてのポインタの余分な未使用バイトがキャッシュを詰まらせ、RAMをオーバーフローさせることさえあります。たとえば、GCCは-m32
フラグでビルドされていますが、これが理由です。x86-64 ISAを搭載した32ビットポインター:どうしてですか?
32ビット値をロードしてポインタとして扱うことは可能です。これは余分な命令を必要とせず、32ビットをロード/計算し、結果のアドレスからロードするだけです。プラットフォームは異なるメモリマップを持っているので、このトリックは移植可能ではありません。 Mac OS Xでは、アドレス空間の下位4 GiB全体が予約されています。それでも、私が書いた1つのプログラムでは、真の64ビットアドレスよりも性能を大幅に向上させたり、-m32
でコンパイルしたりする前に、32ビットの「アドレス」に0x100000000L
をハックアップして追加しました。
32ビットx86-64プラットフォームを使用する上で基本的な障害はありますか?このようなキメラをサポートすると、オペレーティングシステムに複雑さが増し、最後の20%を望んでいる人は誰でもMake it Work™を実行する必要がありますが、これはさまざまな計算集約型プログラムに最適です。
多くのアプリケーションでデータをプロファイリングすると、ポインタサイズが大きくなっても大きな損失はないことが示唆されています。 – Puppy
インテル®コンパイラーには、['Qauto-ilp32'](http://software.intel.com/sites/products/documentation/hpc/compilerpro/en-us/cpp/lin/compiler_c/copts/ccpp_options/option_qauto_ilp32)オプションがあります。 .htm)は、ポインタのために32ビットを使用しようとする(x64モードでも)。 – Mysticial
@Mysticialしかし、これは古くからの 'near'や' far'ポインタのようなものですよね?その解決策はOKですが、私が言及しているものほどきれいではありません。 – Potatoswatter