stdafx.h для всех заголовочных файлов или только соответствующих

При использовании оптимизированной компиляции Microsoft -stdafx.h - идея о том, что все включаются, должна встречаться только в этом файле. Или это просто компоненты, интенсивно компилирующие?

Если придерживаться правила all, получу ли я более быстрый и эффективный дизайн компиляции?

stdafx.h:

... Standard C++ includes

#include "Base.h"
#include "Super.h"

Где файлы заголовков Base и Super, а также файлы cpp содержат только заголовок stdafx.h


person sazr    schedule 04.01.2016    source источник
comment
ИМХО, stdafx.h создает больше проблем, чем решает. Предварительно скомпилированные заголовки должны быть в огромных сборках, где это действительно имеет значение.   -  person Thomas Matthews    schedule 05.01.2016
comment
Эм, почему минус?   -  person sazr    schedule 05.01.2016
comment
Я полагаю, что вы хотели бы иметь предварительно скомпилированные самые популярные включения. Но это мое мнение. Я не понимаю, как огромный предварительно скомпилированный заголовок ускорит компиляцию, когда внутри него находится всего несколько определений.   -  person Thomas Matthews    schedule 05.01.2016
comment
Вы также измеряете производительность сборки. Устройства хранения данных работают быстрее, как и ПК. Измерьте 10 пересборок с предварительно скомпилированными заголовками и 10 без них. Рассчитайте среднее время сборки. Существенна ли экономия времени? Сделайте то же самое еще раз, только перекомпилировав один файл. Экономия времени по-прежнему значительна?   -  person Thomas Matthews    schedule 05.01.2016
comment
является идеей, что все включения должны когда-либо встречаться только в этом файле Нет. Я говорю, что в этот файл следует помещать только заголовки для внешних библиотек или, по крайней мере, заголовки, которые обычно не изменяются .   -  person drescherjm    schedule 05.01.2016


Ответы (1)


При использовании дизайна быстрой компиляции Microsoft -stdafx.h - идея заключается в том, что все включения должны когда-либо встречаться только в этом файле.

Не все заголовки следует помещать в stdafx.h, как прокомментировал @drescherjm.

Более того, даже если заголовок появляется в stdafx.h, это не означает автоматически, что он должен исчезнуть из cpp файлов. По крайней мере, согласно 4 способа, как прекомпилированные заголовки наносят вред вашему коду (хотя и не о Microsoft, а о том же принцип, выделение мое):

Шаблоны проектов Apple для iOS начинаются с Prefix.pch, включая Foundation и UIKit. С точки зрения скорости компиляции это имеет большой смысл. Проблема в том, что люди заметили и сказали: «Эти файлы уже неявно включены. Так что мне не нужно включать их снова». Обнаружив этот побочный эффект, некоторые программисты начинают выгружать больше заголовков в Prefix.pch. Потому что, эй, тогда вам больше никогда не придется импортировать его #import.

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

И это совершенно неправильно.

....

Проблема в том, что для успешной компиляции файла уже недостаточно иметь пару заголовка (.h) и реализации (.m). Вам также нужен файл Prefix.pch — не потому, что он предварительно скомпилирован, а потому, что он неявно включен.

И они дают несколько пунктов, в основном развивая идею о том, что это ломает концепцию зависимости.

person AlexD    schedule 04.01.2016
comment
вам нужно будет объяснить Precompiled headers are not supposed to minimize **number** of includes. Вопрос не в том, сколько раз включать заголовок? Речь идет о том, где (stdafx.h или где-то еще) включить этот заголовок, чтобы достичь цели оптимизированной компиляции. - person sazr; 05.01.2016
comment
@JakeM Обновлено. Отвечая на ваш вопрос stdafx.h или еще: согласно данной рекомендации, кажется, что файлы .h должны размещаться нормально, так как это не будет предкомпилированных заголовков, и, кроме того, некоторые следует поместить в stdafx.h для ускорения компиляции. - person AlexD; 05.01.2016