web-dev-qa-db-ja.com

x64コードをコンパイルするとき、「x86_AMD64」と「AMD64」の違いは何ですか?

VC++でコードをコンパイルする場合、 [〜#〜] msdn [〜#〜] は、x86_AMD64ツールセットまたはAMD64ツールセットの使用(vcvarsall.batを呼び出す場合)の間のオプションを提供します。

X64コードをコンパイルするときに、これらの2つの中からどのように選択しますか? AMD64オプションは、クロスコンパイラよりも効率的なx64マシンコードを生成しますか?

31
Meta

効率とは関係ありません。ネイティブとクロスコンパイラーはどちらも同じマシンコードを生成します。ただし、64ビットワークステーションでネイティブ64ビットコンパイラプロセスを実行することにより、いくつかの利点があります(より大きなレジスタ、より大きなメモリ空間など)。

ネイティブコンパイラは64ビットのWindowsコピーでのみ実行されるため、ワークステーションが32ビットの場合、このコンパイラは実行されません。

クロスコンパイラーは、WoWを介してWindowsの64ビットコピーで実行されますが、x86マシンで実行することを目的としています。ただし、これを行う理由はありません。

あなたがリンクするページはそれをかなりよく言っています:

x86 on x86(x64 cross-compiler)
x64用の出力ファイルを作成できます。このバージョンのcl.exeは、32ビットプロセスとして実行され、x86マシンでネイティブで、64ビットWidowsオペレーティングシステムのWOW64で実行されます。

x64 on x64
x64用の出力ファイルを作成できます。このバージョンのcl.exeは、x64マシンでネイティブプロセスとして実行されます。

Brian R. Bondy の引用書式のおかげで

25
joshperry

あなたがリンクしたものから:

x86 on x86(x64 cross-compiler)
x64用の出力ファイルを作成できます。このバージョンのcl.exeは、32ビットプロセスとして実行され、x86マシンでネイティブで、64ビットWidowsオペレーティングシステムのWOW64で実行されます。

x64のx64
x64用の出力ファイルを作成できます。このバージョンのcl.exeは、x64マシンでネイティブプロセスとして実行されます。

言い換え:

X86_AMD64を使用する場合、通常はx86マシンで開発しており、x64でネイティブに実行されるx64ファイルを作成します。このオプションはx64マシンでも使用できますが、コンパイラはWOW64エミュレーションで実行されます。

AMD64を使用する場合、x64マシンで開発していて、x64でネイティブに実行されるx64ファイルを作成します。コンパイラーはx64でネイティブに実行されています。このオプションは、x64プログラムをビルドする場合により効率的です。

実行できないのでデバッグできないので、なぜx86プログラムをx86コンピューターで開発するのか疑問に思うかもしれません。たとえば、x86であるビルドサーバーがあり、そのビルドサーバーがx86とx64の両方の出力を生成する必要がある場合などは、これはまだ役に立ちます。

X86ベースのプログラム(x86_AMD64)の場合、コンパイラーをx64で実行するにはどうすればよいですか?これが、x64マシンで任意のx86プログラムを実行できるのと同じ理由です。WOW64エミュレーションのおかげです。

WOW64エミュレーションとは:

WOW64エミュレーションは、x86コンピューター(またはIA64)でx86プログラムを実行すると発生します。 WOW64は、Windows 64上のWindows 32を表します。これは、x86プログラムを実行できるx64マシン上のエミュレーションレイヤーです。

ファイルシステムの操作はWOW64フォルダーにリダイレクトされ、レジストリもサブノードにリダイレクトされます。たとえば、プログラムファイルのフォルダーを取得しようとすると、WOW64を使用している場合はc:\program files (x86)\が返されますが、x64を使用している場合はc:\program files\が返されます。

別の例として、レジストリでHKLM\Software\Somethingに書き込もうとすると、x86プログラムの知識がなくても実際にHKLM\SOFTWARE\Wow6432Node\Somethingにリダイレクトされます。

ネイティブx64ビルドを実行すると、WOW64エミュレーションを実行するよりも効率的になります。なぜですか? 32ビットの呼び出しを64ビットの呼び出しに変換する追加のエミュレーションレイヤーがないためです。

ちなみに、x64バージョンのWindowsを実行している場合は、プロセスリストのプロセス名に* 32が追加されるため、WOW64を介して実行されているプロセスを確認できます。

10
Brian R. Bondy