При компиляции кода с помощью VC ++ MSDN предоставляет вам вариант между использованием набора инструментов x86_amd64 или набора инструментов amd64 (при вызове vcvarsall.bat).
Как мне выбрать между этими двумя при компиляции кода x64? Будет ли вариант amd64 производить более эффективный машинный код x64, чем кросс-компилятор?
2 ответа
Это не имеет ничего общего с эффективностью. Собственный компилятор и кросс-компилятор будут генерировать один и тот же машинный код. Однако вы получите некоторые преимущества, запустив собственный процесс 64-битного компилятора на 64-битной рабочей станции (большие регистры, большее пространство памяти и т. Д.).
Собственный компилятор будет работать только в 64-битной копии Windows, поэтому, если ваша рабочая станция 32-битная, этот компилятор даже не запустится.
Кросс-компилятор предназначен для работы на машинах x86, даже если он будет работать на 64-битной копии Windows через WoW; однако для этого нет никаких причин.
Страница, на которую вы ссылаетесь, хорошо об этом говорит:
x64 на x86 (кросс-компилятор x64)
Позволяет вы создаете выходные файлы для x64. Эта версия cl.exe работает как 32-битный процесс, родной для x86 машина и под WOW64 на 64 бит Операционная система Widows.x64 на x64
Позволяет создавать вывод файлы для x64. Эта версия cl.exe работает как собственный процесс на x64 машина.Спасибо Брайану Р. Бонди за форматирование цитаты
Из того, что вы связали:
x64 на x86 (кросс-компилятор x64)
Позволяет вы создаете выходные файлы для x64. Эта версия cl.exe работает как 32-битный процесс, родной для x86 машина и под WOW64 на 64 бит Операционная система Widows.x64 на x64
Позволяет создавать вывод файлы для x64. Эта версия 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-битные.
Кстати, если вы используете версию Windows x64, вы можете увидеть, какие процессы выполняются через WOW64, потому что к имени процесса в списке процессов будет добавлено * 32.
Похожие вопросы
Связанные вопросы
Новые вопросы
visual-c++
Microsoft Visual C++ — это компилятор C, C++ и C++/CLI для Windows. Самая последняя версия компилятора — Visual C++ 2022. Компилятор поддерживает следующие языки: C (поддерживает C90 и большинство частей C99, C11, C17 стандарта ISO C++ по состоянию на Visual Studio 2022); C++ (поддержка большинства функций C++11, C++14, C++17 и C++20 и нескольких функций C++23 по состоянию на Visual Studio 2022) C++/CLI (обеспечивает взаимодействие с языками .NET, такими как C#).