Удивительное рядом — clang и оптимизация
От: Dair Россия  
Дата: 09.04.16 19:00
Оценка:
Коллега из соседнего проекта попросил у меня помощи.
Проект, говорит, не собирается — компилирует бесконечно долго, уже и кофе пил, и на ночь оставлял.

Давай, говорю, проект, хоть посмотрю что как.
Посмотрел.

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;


Компилируется.

Интересно как оптимизация сработала. Точнее, кмк, не сработала.
Отредактировано 09.04.2016 20:17 Dair . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.