Длительное время компиляции в Visual C ++ 2010 с большими статическими массивами

У нас есть проект C ++, в котором есть несколько больших статических таблиц данных (массивов структур), сгенерированных инструментом предварительной обработки и скомпилированных в наш проект. До сих пор мы использовали VC ++ 2008, но готовимся к переходу на 2010, и эти таблицы данных внезапно стали очень долго компилировать.

Например, одна такая таблица содержит около 3000 записей, каждая из которых представляет собой структуру, содержащую несколько целых чисел и указателей, инициализированных статически. Для компиляции этого файла в VC ++ 2008 потребовалось ~ 15 секунд, а в VC ++ 2010 - 30 минут !

В качестве эксперимента я попытался равномерно разделить эту таблицу на 8 таблиц, каждая в своем собственном файле .cpp, и каждая из них компилируется за 20-30 секунд. Это заставляет меня думать, что что-то внутри компилятора имеет длину O (n ^ 2) в этих таблицах.

Использование памяти для кл.exe на плато около 400 МБ (на моей машине 12 ГБ ОЗУ), и я не вижу никаких операций ввода-вывода, когда они выходят на плато, поэтому я считаю, что это не проблема кэширования диска.

Есть ли у кого-нибудь идеи, что здесь может происходить? Есть ли какая-то функция компилятора, которую я могу отключить, чтобы вернуться к нормальному времени компиляции?

Вот образец данных в таблице:

//  cid (0 = 0x0)
{
    OID_cid,
    OTYP_Cid,
    0 | FOPTI_GetFn,
    NULL,
    0,
    NULL,
    (PFNGET_VOID) static_cast<PFNGET_CID>(&CBasic::Cid),
    NULL,
    CID_Basic,
    "cid",
    OID_Identity,
    0,
    NULL,
},

//  IS_DERIVED_FROM (1 = 0x1)
{
    OID_IS_DERIVED_FROM,
    OTYP_Bool,
    0 | FOPTI_Fn,
    COptThunkMgr::ThunkOptBasicIS_DERIVED_FROM,
    false,
    NULL,
    NULL,
    NULL,
    CID_Basic,
    "IS_DERIVED_FROM",
    OID_Nil,
    0,
    &COptionInfoMgr::s_aFnsig[0],
},

//  FIRE_TRIGGER_EVENT (2 = 0x2)
{
    OID_FIRE_TRIGGER_EVENT,
    OTYP_Void,
    0 | FOPTI_Fn,
    COptThunkMgr::ThunkOptBasicFIRE_TRIGGER_EVENT,
    false,
    NULL,
    NULL,
    NULL,
    CID_Basic,
    "FIRE_TRIGGER_EVENT",
    OID_Nil,
    0,
    NULL,
},

//  FIRE_UNTRIGGER_EVENT (3 = 0x3)
{
    OID_FIRE_UNTRIGGER_EVENT,
    OTYP_Void,
    0 | FOPTI_Fn,
    COptThunkMgr::ThunkOptBasicFIRE_UNTRIGGER_EVENT,
    false,
    NULL,
    NULL,
    NULL,
    CID_Basic,
    "FIRE_UNTRIGGER_EVENT",
    OID_Nil,
    0,
    NULL,
},

Как видите, она включает в себя различные целые числа и перечисления, а также несколько буквальные строки, указатели функций и указатели на другие статические таблицы данных.

10
задан Vadim Kotov 11 August 2017 в 08:58
поделиться