Почему этот статический массив вызывает чрезвычайно длинный шаг «генерации кода» в сборке релиза? - PullRequest
3 голосов
/ 17 января 2010

Я недавно добавил статический массив поиска в один из моих классов, например:

// MyClass.h
class MyClass
{
    static MyClass const s_fromIndex[1500];
public:
    MyClass(size_t arg1, size_t arg2);

    static MyClass fromIndex(size_t index) { return s_fromIndex[index]; }

}

// MyClass.cpp
MyClass const MyClass::s_fromIndex[1500] = 
{
    MyClass(0, 1), MyClass(0, 2), MyClass(0, 3), MyClass(0, 4),
    ...
};

Причиной использования массива является то, что вычисление от индекса до двух параметров довольно дорого (несмотря на то, что это выглядит в примере кода). Поскольку индекс ограничен 1500, я решил вместо этого вернуть объекты из массива поиска.

Класс находится в проекте статической библиотеки. Вскоре я заметил, что всякий раз, когда я использовал MyClass в своем исполняемом проекте, этап «генерации кода» во время сборки внезапно занимал очень много времени (2-3 минуты). Ранее этот шаг выполнялся практически мгновенно. Отладочная сборка по-прежнему завершается очень быстро.

Когда я вынимаю статический массив, все снова строится гладко.

Как ни странно, я не могу воспроизвести проблему в новом чистом проекте только с приведенным выше кодом, поэтому могут происходить некоторые другие вещи.

Есть ли у вас идеи, почему статический массив вызывает чрезвычайно длинный шаг «генерации кода» в сборке релиза? Что компилятор / компоновщик делает на этом шаге?

Редактировать: В настоящее время я обошел проблему, используя статический вектор и заполняя его во время выполнения. Мне все еще интересно, что может вызвать чрезвычайно длинный шаг генерации кода. Кроме того, я хотел бы добавить, что в действительности MyClass больше, чем пример кода, который я опубликовал. В частности, у него есть один (и только один) закрытый член. Тип этого члена является шаблонным классом. Может быть, это как-то связано с этим.

1 Ответ

0 голосов
/ 17 января 2010

У вас включены разные оптимизации в разных сборках?

Я заметил это однажды и с быстрым и грязным приложением с действительно большими статическими инициализацией массива и сборками релиза - отладочная версия была построена быстро, релиз занял бы FOREVER. В конце концов я сдал и загрузил данные во время выполнения и во время компиляции и никогда не определял конкретные параметры оптимизации, которые вызывали проблему.

...