Компилируется ли C++11 медленнее, чем C++98?

Я хотел переключить настройки моего проекта с C++98 на C++11, но я весьма скептически отношусь к этому из-за дополнительного времени компиляции.

В моем (довольно большом) проекте около 800 файлов, и проект создается с помощью cmake. В XCode с настройкой C++98 он компилируется примерно за 15 минут на машине i7 4 ГГц (жесткий диск ssd, 16 ГБ оперативной памяти).

При переходе на C++11 это занимает около 25 минут (в Windows с Visual Studio 2013 еще хуже — почти вдвое больше времени!)

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

И да, я использую форвардные объявления, идиомы pimpl, даже пробовал двойное включение охранников, и я удалил множество шаблонов, которые мне больше не нужны, благодаря C++11 (поэтому компиляция должна быть еще быстрее, но это не так — это помедленнее!)

Компилируется ли C++11 медленнее, чем C++98? И почему об этом никто не говорит?


person hhamm    schedule 09.12.2015    source источник
comment
Если мы когда-нибудь получим модули, мы надеемся, что это решит эти проблемы...   -  person Karoly Horvath    schedule 09.12.2015
comment
@Default: я ничего там не вижу. gcc поддерживает старую концепцию концепций. И что...   -  person Karoly Horvath    schedule 09.12.2015


Ответы (1)


На ваш вопрос нет общего ответа, это вопрос реализации.

Некоторые компиляторы быстрее других. Phoronix утверждает, что Zapcc работает быстрее, чем его конкурентов (но я понятия не имею, я никогда не слышал о zapcc раньше).

Я предполагаю, что для одного и того же компилятора компиляция в стиле C++11 может быть медленнее, чем компиляция в стиле C++03 (поскольку в C++11 введена дополнительная "перегрузка синтаксиса" и auto, а также функция например конструкторы перемещения, которым может потребоваться дополнительная поддержка)

C++11 известен своей медленной компиляцией, в частности потому, что стандартные заголовки (такие как <map> или <vector>....) приносят много материала (и, вероятно, больше в C++11, чем в C++03).

Например, следующий файл e.cc (всего два стандартных включения!):

#include <vector>
#include <map>

При компиляции с g++ -std=c++11 -C -E e.cc | wc -l я получаю 41870 предварительно обработанных строк, при компиляции с g++ -std=c++03 -C -E e.cc | wc -l я получаю 15598 строк, обе с GCC 5.3 для Linux/Debian/Sid/x86-64.

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

Поскольку cmake генерирует Makefile с для make, вы можете попробовать параллельную сборку с make -j

person Basile Starynkevitch    schedule 09.12.2015
comment
Ваша последняя строка должна начинаться с C++11 или только с C++? В его нынешнем виде (С++ 11) кажется, что это противоречит остальной части ответа. - person Angew is no longer proud of SO; 09.12.2015
comment
Я не удивлюсь, если C++11 <vector> больше, чем C++03 <vector> - person Basile Starynkevitch; 09.12.2015
comment
Оказалось, что умные предварительно скомпилированные заголовки действительно помогли вернуться к нормальному времени компиляции. Так что слава пойдет на этот пост. Большое спасибо! +1 - person hhamm; 14.12.2015