我们有一个 C++ 项目,其中有几个大型静态数据表(结构数组)由预处理工具生成并编译到我们的项目中。到现在我们一直在使用VC++ 2008,但是准备移到2010,这些数据表突然需要很长的时间来编译。
例如,一个这样的表有大约 3,000 个条目,每个条目都是一个包含多个整数和指针的结构,所有这些都是静态初始化的。这个文件在 VC++ 2008 中编译需要大约 15 秒,但在 VC++ 2010 中需要 30分钟!
作为一个实验,我尝试将这个表平均分成 8 个表,每个表都在自己的 .cpp 文件中,每个表在 20-30 秒内编译。这让我觉得编译器内部的东西在这些表的长度上是 O(n^2)。
cl.exe 的内存使用稳定在 400 MB 左右(我的机器有 12 GB 的 RAM),一旦稳定,我就看不到任何 I/O 活动,所以我相信这不是磁盘缓存问题。
有谁知道这里会发生什么?是否有一些编译器功能我可以关闭以恢复正常的编译时间?
以下是表中数据的示例:
// 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,
},
如您所见,它包括各种整数和枚举以及一些文字字符串、函数指针和指向其他静态数据表的指针。