Как я могу запустить препроцессор и компилятор MSVC в два отдельных этапа? - PullRequest
9 голосов
/ 21 января 2011

Я бы хотел запустить компилятор Microsoft Visual Studio cl.exe без вызова препроцессора. Это возможно? Я думал, что простая компиляция предварительно обработанного исходного кода (с использованием флага /c) сделает запуск препроцессора невозможным, но, очевидно, это не так. Я сделал немного сравнительного анализа. Вот небольшой исходный файл (main.cpp), который просто включает в себя некоторый код:

#include <iostream>
#include <string>
#include <windows.h>

Вот несколько различных вызовов компилятора и их время:

1: cl /c main.cpp                             ~1.02s
2: cl /EP main.cpp > main-preprocessed.cpp    ~0.5s
3: cl /c main-preprocessed.cpp                ~0.75s

Кажется, что компиляция предварительно обработанного исходного кода уже немного быстрее (препроцессор ничего не должен делать). Однако разница между 1 и 2 предполагает, что фактическому компилятору и ассемблеру нужно чуть больше 0,5 с. Таким образом, компиляция предварительно обработанного исходного кода (как сделано в шаге 3) немного медленнее, чем я ожидал.

Есть ли способ просто запустить компилятор и ассемблер, не вызывая препроцессор? Меня интересуют решения для MSVC6 вплоть до MSVC10.

Ответы [ 2 ]

3 голосов
/ 21 января 2011

Насколько мне известно, нет способа запустить компилятор без препроцессора (независимо от того, что он ничего не делает.

Однако разделение двух этапов, очевидно, будет медленнее, когда вы добавляетезаписать в файл и затем прочитать обратно этот файл. Если ему не нужно делать эти записи, он может сохранить его в памяти, и вы сэкономите тонну времени, ожидая, пока диск будет записан и прочитан.

т.е. даже если бы вы могли отключить препроцессор, он все равно работал бы медленнее, чем одновременное выполнение обоих этапов.

0 голосов
/ 21 января 2011

Вполне возможно, что большая часть времени, которое, как вы думаете, занимает препроцессор, на самом деле тратится на запись этого большого файла на диск.Препроцессор должен фактически занимать крошечный процент времени, которое занимает остальная часть компилятора.Большим преимуществом обычной пре / компиляции является то, что компилятор может начать компиляцию, когда стадия препроцессора все еще выполняется, возможно, в отдельном потоке или когда он обнаруживает новый вывод препроцессора.Большие выходные данные препроцессора, возможно, не должны занимать память (не говоря уже о диске), так как они потребляются и перезаписываются небольшими порциями.

...