Что содержат предварительно скомпилированные заголовки Visual Studio? - PullRequest
5 голосов
/ 21 января 2011

Вопрос касается содержимого двоичного файла .pch, созданного компилятором Visual Studio. Что это содержит? Это только проанализированное дерево заголовочных файлов или объектный код?

Рассмотрим этот пример:

// myheader.h
#include <vector>
class A {
public:
  void add(int i) { v.push_back(i); }
private:
  std::vector<int> v;
};

Включение этого заголовка в набор для прекомпиляции приведет к полной компиляции шаблона вектора , который компилируется и добавляется в .pch?

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

1 Ответ

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

Хотя я не могу сказать что-то определенное о внутреннем мире PCH, что касается единства, даже если vector<int> полностью создан в PCH, Я думаю, что построение единства все еще имеет некоторое преимущество.

Как вы, возможно, знаете, C ++ должен соблюдать правило одного определения (ODR). Линкер должен объединить определения шаблона, разбросанные в каждом объектном файле, в один.
То есть, грубо говоря, C ++ должен делать следующее:

  1. Создание шаблонов
  2. Запись объектного файла
  3. Перечитать объектный файл для ссылки
  4. Разрешить ODR

Сборки Unity позволяют в определенной степени сохранить вышеуказанную нагрузку.
Тем не менее, я не могу сказать, что вышеупомянутая экономия превзойдет сборник не-единства система с PCH в вашей среде.

...