Обоснование установки «Любого ЦП / Предпочитают 32-битный» в качестве параметра сборки по умолчанию в VS - PullRequest
0 голосов
/ 10 февраля 2019

Предположим, использовать последнюю версию Visual Studio и C # на x64 Windows и выделять значительный объем данных.

Достаточно уверенно при компиляции с использованием параметров сборки по умолчанию (как показано ниже для VS 2019 Preview 2.1)), вы исчерпаете виртуальное адресное пространство пользователя, когда ваш процесс достигнет 4 ГБ.Этого следует ожидать, и причина обсуждается здесь .

enter image description here

Само выделение может быть сделано, например, путем созданиянесколько сотен простых массивов, каждый из которых содержит несколько миллионов int элементов.

Я хотел бы понять, почему Any CPU/Prefer 32-bit был выбран в качестве варианта сборки по умолчанию.Я также заметил, что VS 2015 также имеет ту же настройку по умолчанию, и, скорее всего, все версии, которые вышли начиная с VS 11, как описано здесь .

Обычно задают вопрос «Чтотакое AnyCPU ...? "и на него неоднократно отвечали ( 1 2 3 4 5 ), кратко затрагивая преимуществанацеливание x86 / x64 / Any CPU + Prefer 32-bit.Но я не нашел однозначного ответа на вопрос, почему в качестве настройки по умолчанию в VS выбрано Any CPU + Prefer 32-bit.

Прохождение по причинам, указанным против сборки для x64 по умолчанию:

  • Процесс x64 будет использовать больше памяти: для простого примера, описанного выше (массивы массивов int), это не должно иметь место.Конечно, ссылка на сам массив будет двойной (8 байт вместо 4), но это все.В соответствии с книгой «Внутренние компоненты Windows» (глава «Управление памятью») записи PFN в самих структурах таблицы страниц имеют ширину 64 бита как для архитектуры x86, так и для архитектуры x64, только 3 (для x86)vs 4 (для x64) уровней таблиц для преобразования виртуальных адресов в физические.Что касается данных, на которые ссылаются, это тот же размер (4 байта на int значение).Таким образом, выделение 20 массивов по 10 миллионов int будет примерно равно 800 МБ, используемым для обеих архитектур в управляемой куче.На самом деле, общий фиксированный размер в x64 версии только что описанного простого примера был примерно таким же, как в x86 при тестировании (сравнение следует, x64 сверху, x86 ниже; и игнорируя блок 4 ГБ, который просто находится в зарезервированном состоянии дляверсия x64).Интересно, что при выполнении 32-разрядного процесса на x64 каждый поток в этом процессе будет иметь 2 стека: 32-разрядный wow64 и 64-разрядный, что приводит к более высокому потреблению памяти с точки зрения стека.,enter image description here
  • Переносимость между платформами: ответ здесь (осторожно, еще до изобретения опции Prefer 32-bit) предоставляет ссылку на MSрекомендация (статья обновлена ​​по состоянию на 2017 год на момент написания статьи).Ссылочная статья также отображает матрицу совместимости, но это только для UWP.В частности, для архитектуры ARM, которая является готовой целью для вывода сборки, использующей AnyCPU/Prefer 32-bit, это поддерживается хорошей таблицей этот ответ . В этой статье также есть ссылки, в которой показаны изменения, внесенные .NET 4.5 и влияние на ARM.
  • Несовместимость с существующими 32-разрядными приложениями: кто-то комментирует здесь о том, что Office является проблемой, поскольку он обычно устанавливается как 32-разрядный.Не так много дополнительной информации.
  • Загруженные сборки: выдается исключение BadImageFormatException при попытке загрузить сборку x86 внутри процесса x64 или наоборот.Однако в комментариях к этому комментарию указано, что сборка, скомпилированная с Any CPU/Prefer 32-bit, может быть загружена в 64-битном процессе. Мне не удалось найти официальную статью, подтверждающую это, хотя позже редактировать : Он может быть загружен просто отлично;Я подробно описал это и все возможные тесты для загрузки сборки здесь

В итоге настройка по умолчанию Any CPU/Prefer 32-bit, скорее всего, является компромиссом, и большой (> 4 ГБ) доступ к памяти был принесен в жертву ради чего-то еще более важного.

Ограничение для процесса x64Виртуальное адресное пространство в пользовательском режиме на Win10 составляет 128 ТБ, а 4 ГБ физической оперативной памяти входят в стандартную комплектацию современных ноутбуков начального уровня, что потенциально может лишить преимущества всей этой дополнительной ОЗУ (максимальные пределы физической памяти для версий Windows здесь равны ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...