gpt4 book ai didi

c++ - 具有大型静态数组的 Visual C++ 2010 中的编译时间较长

转载 作者:可可西里 更新时间:2023-11-01 15:55:54 26 4
gpt4 key购买 nike

我们有一个 C++ 项目,其中有几个大型静态数据表(结构数组)由预处理工具生成并编译到我们的项目中。我们一直在用VC++ 2008,但准备迁移到2010,这些数据表突然需要很长时间来编译。

例如,一个这样的表有大约 3,000 个条目,每个条目都是一个包含多个 int 和指针的结构,所有这些都是静态初始化的。这个文件在 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,
},

如您所见,它包括各种整数和枚举以及一些文字字符串、函数指针和指向其他静态数据表的指针。

最佳答案

可能值得关闭此文件的所有优化(无论如何它不会给你买任何东西)以防它是 N^2 的优化器。

关于c++ - 具有大型静态数组的 Visual C++ 2010 中的编译时间较长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7893850/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com