Коллега из соседнего проекта попросил у меня помощи.
Проект, говорит, не собирается — компилирует бесконечно долго, уже и кофе пил, и на ночь оставлял.
Давай, говорю, проект, хоть посмотрю что как.
Посмотрел.
Version 7.3 (7D175), Apple LLVM version 7.3.0 (clang-703.0.29), проект под iOS.
В самом деле, без оптимизации проект собирается, с -Os (штатный для сборки релиза для заливки в аппстор) — не собирается. Висит бесконечно на этапе компиляции, ещё до линковки. Прождал 10 минут (перекурил), cancel.
Нашёл файл, который не хочет компиляться.
C++98, никакого Objective-C++ (игра). Никакого boost или ещё какой шаблонной магии. Конкретно в этом файле даже STL нет.
Вообще файл назван main.cpp, содержит 7 глобальных переменных числовых типов (uint, DWORD и float; одна из глобальных переменных gMsPerFrame (вполне self-explaining) типа float) и несколько функций без классов общего вида, типа
void Init()
{
gSomeObject.Init();
gSomeOtherObject.Init();
...
}
Все эти gObject определены в других файлах.
Начал комментировать последовательно, нашёл участок кода, который приводит к эффекту.
в функции Update(), которая, как я предполагаю, вызывается каждый кадр игры, есть определение FPS. Ну, там, получить время, понять сколько времени прошло с предыдущего запроса. Что от этого зависит — не разбирался.
Но добавлен нижний "фильтр" на FPS вот такого совершенно невинного вида:
if (gMsPerFrame > 66)
gMsPerFrame = 66;
Закомментарил — всё компилируется.
Заменил на такой же невинный фрагмент:
float newMsPerFrame = gMsPerFrame > 66? 66: gMsPerFrame;
gMsPerFrame = newMsPerFrame;
Компилируется.
Интересно как оптимизация сработала. Точнее, кмк, не сработала.