Существуют ли разные .net CLR для x86 и x64? - PullRequest
0 голосов
/ 22 марта 2012

Существуют ли разные .net CLR для x86 и x64?

decimal i = 89;
i=i++;

Будет ли приведенный выше код иметь другой собственный код, сгенерированный CLR для x86, x64?

ОБНОВЛЕНИЕ: Если да, то когда я установлю Visual Studio на мой компьютер, будут ли установлены обе версии CLR независимо от битов машины?Это связано с производительностью?

1 Ответ

3 голосов
/ 22 марта 2012

Да, есть как 32-битный, так и 64-битный JITter. Какой код будет выполнять ваш код, зависит как от среды / процесса хоста, который загрузил CLR, так и от самой сборки.

Когда вы собираете свои сборки, вы можете выбрать, будет ли он нацелен на x86, x64 или «AnyCPU».

  • AnyCPU будет работать как 32-разрядный в 32-разрядном и 64-разрядный в 64-разрядном.
  • 32-разрядная будет работать как 32-разрядная на 32-разрядной и будет работать под WOW64 на 64-разрядной.
  • 64-разрядная не будет работать под 32-разрядной, но будет работать как 64-разрядная на 64-разрядной.

Существует также случай «устаревших» сборок, которые были построены до того, как была введена эта возможность. Я считаю, что они действуют так же, как 32-разрядные.

Обратите внимание, что если ваша сборка имеет какие-либо 32-битные собственные зависимости, то вы также должны пометить ее как 32-битную, в противном случае она будет загружена как 64-битная в 64-битной среде и зависимости не загрузятся.

Чтобы ответить на ваши обновленные вопросы:

На 64-битных машинах будет установлена ​​как 32-битная, так и 64-битная CLR. 32-битная версия необходима для запуска 32-битных сборок под WOW64. (Например, Visual Studio является 32-разрядным!)

32-бит может иногда работать быстрее, потому что указатели меньше, поэтому на них тратится меньше кеша / памяти. С другой стороны, 64-битный режим имеет больше регистров, доступных для использования JITter. Это зависит от характеристик кода.

...