защита строки подключения [дубликат]

8
задан 8 March 2010 в 14:18
поделиться

5 ответов

Архитектура компилятора

Компилятор не генерирует код напрямую из источника, он сначала компилирует его в промежуточную форму (см. компилятор перед- end ), а затем генерирует код из промежуточной формы, включая любые оптимизации (см. внутренняя часть компилятора ).

Создание процесса компилятора Visual Studio

В процессе сборки Visual Studio (cl.exe) выполняется компиляция нескольких исходных файлов, использующих одни и те же параметры командной строки в одной команде. Компилятор сначала выполняет «компиляцию» последовательно для каждого файла (это, скорее всего, интерфейс), но «Генерация кода» (вероятно, серверная часть) выполняется вместе для всех файлов, когда с ними выполняется компиляция.

Вы можете убедиться в этом, просмотрев cl.exe с помощью Process Explorer.

Почему генерация кода для нескольких файлов одновременно

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

Оптимизация всей программы

Теоретически на этом этапе можно было бы выполнить некоторую оптимизацию модулей кросс-компиляции, но это не делается - такие оптимизации никогда не выполняются, если не включены с / LTCG и с LTCG: генерация всего кода выполняется для всей программы сразу (отсюда и название Whole Program Optimization).

Примечание: похоже, что WPO выполняется компоновщиком, поскольку он создает exe из файлов obj, но это своего рода иллюзия - файлы obj не являются реальными объектными файлами, они содержат промежуточное представление и «компоновщик» не является настоящим компоновщиком, так как он не только связывает существующий код, он также генерирует и оптимизирует код.

5
ответ дан 5 December 2019 в 21:18
поделиться

Он распараллеливает сборку (или, по крайней мере, компиляцию), если у вас многоядерный процессор

править : Я почти уверен, что он распараллеливается так же, как "make -j", он компилирует несколько файлов cpp одновременно (поскольку cpp обычно независимы), но, очевидно, связывает их один раз.
На моем компьютере с ядром 2 отображаются 2 задания devenv при компиляции одного проекта.

-1
ответ дан 5 December 2019 в 21:18
поделиться

Когда-то компиляция означала синтаксический анализ исходного кода и генерацию кода. Однако теперь компиляция означает анализ источника и создание символьной базы данных, представляющей код. Затем базу данных можно преобразовать в разрешенные ссылки между символами. Позже база данных используется в качестве источника для генерации кода.

У вас не включена оптимизация. Это остановит процесс сборки от оптимизации сгенерированного кода (или, по крайней мере, намекнет, что оптимизации не следует делать ... Я бы не хотел гарантировать, что оптимизации не будут выполнены). Однако процесс сборки по-прежнему оптимизирован. Итак, для этого объединяются несколько файлов .cpp.

Я не уверен, как принимается решение о том, сколько файлов .cpp объединить вместе.Возможно, компилятор начнет обрабатывать файлы до тех пор, пока не решит, что размер памяти базы данных достаточно велик, так что, если он еще больше увеличится, системе придется начать выполнять чрезмерную подкачку данных на диск и обратно, и прирост производительности от пакетной обработки больше не будет. cpp файлы будут инвертированы.

В любом случае, я не работаю в группе компиляторов VC, поэтому не могу дать окончательный ответ, но я всегда предполагал, что они делают это именно по этой причине.

1
ответ дан 5 December 2019 в 21:18
поделиться

Это ни распараллеливание, ни оптимизация кода.

Длинная фаза «Генерация кода ...» для нескольких исходных файлов восходит к VC6. Это происходит независимо от настроек оптимизации или доступных процессоров, даже в отладочных сборках с отключенной оптимизацией.

Я не анализировал подробно, но мои наблюдения таковы: они возникают при переключении между модулями с разными параметрами компиляции или когда определенный объем кода прошел часть «файл за файлом». Это также этап, на котором большинство сбоев компилятора происходит в VC6.

Предположение: Я всегда предполагал, что это «сложная часть», которая улучшается за счет одновременной обработки нескольких элементов, возможно, только кода и данных, загруженных в кеш.Другая возможность состоит в том, что одноэтапная фаза съедает память как сумасшедшую, и «Генерация кода» освобождает ее.

Чтобы улучшить производительность сборки:

Купите лучшую машину, которую вы можете себе позволить.
Это самое быстрое и дешевое улучшение, которое вы можете сделать. (если у вас его еще нет). Перейдите на Windows 7 x64, купите много оперативной памяти и i7 860 или аналогичный. (Переход от двухъядерного ядра Core2 дал мне коэффициент 6… 8, учитывая все процессоры.)

(Не стоит дешево покупать диски.)

Разделение на отдельные проекты для параллельных сборок
Здесь вступают в игру 8 CPUS (даже если 4 физических + HT) с большим количеством ОЗУ. Вы можете включить распараллеливание для каждого проекта с помощью параметра / MP , но это несовместимо со многими другими функциями.

2
ответ дан 5 December 2019 в 21:18
поделиться

В блоге Visual C ++ появилась новая запись, в которой подробно описаны некоторые недокументированные переключатели, которые можно использовать для определения времени / профиля различных этапов процесса сборки (я Я не уверен, в какой степени, если таковая имеется, запись относится к версиям MSVC до VS2010). Интересный материал, который должен дать хотя бы небольшое представление о том, что происходит за кулисами:

По крайней мере, он позволяет узнать, какие процессы, библиотеки DLL и, по крайней мере, некоторые этапы перевода / обработки соответствуют сообщениям, которые вы видите в нормальный вывод сборки.

0
ответ дан 5 December 2019 в 21:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: