При компиляции кода x64, в чем разница между "x86_amd64" и "amd64"? - PullRequest
29 голосов
/ 18 августа 2010

При компиляции кода с помощью VC ++ MSDN дает вам возможность использовать набор инструментов x86_amd64 или набор инструментов amd64 (при вызове vcvarsall.bat).

Как выбрать между этими двумякогда компилировать код x64?Будет ли опция amd64 производить более эффективный машинный код x64, чем кросс-компилятор?

Ответы [ 2 ]

24 голосов
/ 18 августа 2010

Это не имеет ничего общего с эффективностью. Нативный и кросс-компилятор будут генерировать один и тот же машинный код. Однако вы получите некоторые преимущества, выполнив собственный процесс 64-разрядного компилятора на 64-разрядной рабочей станции (большие регистры, больший объем памяти и т. Д.).

Собственный компилятор будет работать только на 64-битной копии Windows, поэтому, если ваша рабочая станция 32-битная, этот компилятор даже не будет работать.

Кросс-компилятор предназначен для работы на компьютерах с архитектурой x86, даже если он будет работать на 64-битной копии Windows через WoW; однако для этого нет никаких оснований.

На странице, на которую вы ссылаетесь, это хорошо сказано:

x64 на x86 (кросс-компилятор x64)
Позволяет вам создать выходные файлы для x64. Эта версия cl.exe работает как 32-битный процесс, родной для x86 машина и под WOW64 на 64 бит Вдова операционная система.

x64 на x64
Позволяет создать вывод файлы для х64. Эта версия cl.exe работает как родной процесс на x64 машина.

Благодарю Brian R. Bondy за форматирование цитаты

9 голосов
/ 18 августа 2010

Из того, что вы связали:

x64 на x86 (кросс-компилятор x64)
Позволяет вам создать выходные файлы для x64. Эта версия cl.exe работает как 32-битный процесс, родной для x86 машина и под WOW64 на 64 бит Вдова операционная система.

x64 на x64
Позволяет создать вывод файлы для х64. Эта версия cl.exe работает как родной процесс на x64 машина.

Перефразировано:

Если вы используете x86_amd64, то вы, как правило, разрабатываете на компьютере с архитектурой x86 и хотите создавать файлы x64, которые изначально работают на x64. Вы также можете использовать эту опцию на компьютере x64, но ваш компилятор будет работать под эмуляцией WOW64.

Если вы используете AMD64, то вы разрабатываете на компьютере x64 и хотите создать файлы x64, которые изначально работают на x64. Компилятор изначально работает в x64. Эта опция более эффективна для сборки программ x64.

Вы можете задаться вопросом, почему вы когда-либо разрабатывали программу x64 на компьютере x86, поскольку вы не можете запустить ее, вы не можете ее отладить. Ну, это все еще полезно, например, если у вас есть сервер сборки x86, и этот сервер сборки должен генерировать выходные данные как x86, так и x64.

Как возможно, чтобы компилятор работал под x64, если это программа на основе x86 (x86_amd64)? По этой же причине вы можете запускать любую x86-программу на своем x64-компьютере ... Благодаря эмуляции WOW64.

Что такое эмуляция WOW64:

Эмуляция WOW64 происходит при запуске программы x86 на компьютере x64 (или IA64). WOW64 означает Windows 32 на Windows 64. Это слой эмуляции на компьютерах с архитектурой x64, позволяющий выполнять программы для архитектуры x86.

Операции вашей файловой системы будут перенаправлены в папки WOW64, а ваш реестр будет также перенаправлен на подузел. Например, когда вы пытаетесь получить папку для программных файлов, она вернет c:\program files (x86)\, если вы используете WOW64, но вернет c:\program files\, если вы используете x64.

Другой пример, для реестра, если вы попытаетесь записать в HKLM\Software\Something, он действительно перенаправит вас на HKLM\SOFTWARE\Wow6432Node\Something без ведома вашей программы x86.

Запуск собственной сборки x64 будет более эффективным, чем запуск через эмуляцию WOW64. Почему? Потому что у вас нет этого дополнительного уровня эмуляции для преобразования ваших 32-битных вызовов в 64-битные.

Кстати, если вы работаете в 64-разрядной версии Windows, вы можете видеть, какие процессы выполняются через WOW64, потому что к имени процесса в списке процессов добавляется * 32.

...