Подтвердить что ты не робот

Visual Studio С++ enum занимает много времени, чтобы скомпилировать

У меня есть dll с перечислением (и многое другое)

enum class KIT_API VoxelTypes : uint16_t
{
  ... about a hundred entries ...
    ModellingClay_00 = 65406,
... more entries ...
    ModellingClay_128,
    COUNT
};

Значение элемента COUNT равно 65535. Я составлял это более 45 минут на этапе "Generating Code". Если я установил ModellingClay_00 в 10000, он скомпилируется примерно через 5-10 минут. 15000, кажется, занимает немного больше времени, но в итоге скомпилировался.

Есть ли какая-либо причина, по которой перечисление должно занять намного больше времени, чтобы скомпилировать его просто из-за изменения содержащегося в нем значения?

Я почти уверен, что я столкнулся с каким-то внутренним вуду Visual Studio, отведенным для моих личных мук. Может ли кто-нибудь указать что-то очевидное, что я сделал, или даже слышал об этом раньше?

4b9b3361

Ответ 1

Углубленный анализ правилен.

Был статический массив элементов VoxelTypes:: COUNT. Каждый элемент составлял 88 байт, в общей сложности 5 767 168 (5,5 Мб).

Моя работа заключалась в создании массива динамических массивов вместо использования массивной таблицы инициализаторов массива.

Старый:

static Elements whoppingBigTable[] = {
    {Item1, 1, 1},
    {Item2, 2, 2},
};

Новое:

static Elements* whoppingBigTable[64];
for(int i = 0; i < 64; i++)
{
    whoppingBigTable = new Elements[1024];
}
AddElement({Item1, 1, 1});
AddElement({Item2, 2, 2});

Также необходимо было добавить некоторую математическую функцию для доступа к элементам массива. Я предполагаю, что это самый быстрый способ сделать это. Он содержит определения моих вокселей, поэтому мне нужно часто обращаться к нему. (Я полагаю, что я мог бы также определить отдельные массивы для каждого свойства voxel, и эти массивы могут быть достаточно малы для компиляции. Это может быть даже быстрее, чем помещение всех свойств в один гигантский массив)

const Element& GetWhoppingElement(int index)
{
    int majorIndex = index / 1024;
    int minorIndex = index % 1024;
    return whoppingBigTable[majorIndex][minorIndex];
}