我们有一个C++项目,其中有几个由预处理工具生成并编译到项目中的大型静态数据表(结构体数组)。我们一直在使用VC++ 2008,但现在准备升级到2010,这些数据表却突然需要很长时间才能编译。例如,其中一个表大约有3,000个条目,每个条目都是一个包含几个整数和指针的结构体,全部是静态初始化的。这个文件在VC++ 2008中编译需要大约15秒,但在VC++ 2010中需要30分钟!作为实验,我尝试将此表平均分成8个表,每个表放在自己的 .cpp 文件中,它们每个都可以在20-30秒内编译。这让我想到编译器内部的某些东西与这些表的长度成平方关系。
cl.exe 的内存使用率在约400 MB左右,我的机器有12 GB的RAM,在它达到这个值之后我没有看到任何I/O活动,所以我认为这不是磁盘缓存问题。有人知道这里可能发生了什么吗?是否有一些编译器功能可以关闭以恢复正常的编译时间?以下是表中数据的示例:
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,
},
正如您所看到的,它包含各种整数和枚举类型,以及一些文字字符串、函数指针和其他静态数据表中的指针。