Visual Studio C++ 枚举类型编译时间过长

13

我有一个带枚举的dll(还有其他很多东西)

enum class KIT_API VoxelTypes : uint16_t
{
  ... about a hundred entries ...
    ModellingClay_00 = 65406,
... more entries ...
    ModellingClay_128,
    COUNT
};
元素COUNT的值为65535。在“生成代码”阶段编译了45分钟以上。如果我将ModellingClay_00设置为10000,则编译大约需要5-10分钟。15000似乎需要更长的时间,但最终还是编译成功了。更改枚举中包含的值是否应该导致编译时间大幅延长?
我相信我已经触犯了Visual Studio为我的个人折磨而保留的某些内部巫术。有人能指出我做错了什么,或者甚至听说过这种情况吗?

3
枚举对编译时是否有影响?比如说,是否有一些与 COUNT 值绑定的模板实例化? - Angew is no longer proud of SO
让编译器通宵运行后,我得到了这个错误: C1128 节的数量超过了目标文件格式限制:请使用 /bigobj 进行编译。我仍在研究它的含义和我能做什么,但这是一个很好的线索。 - NapkinTrout
1
这进一步加强了我对基于该枚举生成某些内容的怀疑。如果您编译一个仅包含枚举定义而没有其他内容的文件,是否会像原始情况一样变慢? - Angew is no longer proud of SO
是的,Angew是正确的。谢谢。 - NapkinTrout
1
这就是为什么创建一个 [mcve] 总是一个好主意。 - Angew is no longer proud of SO
请原谅。我在另一个项目中构建了一个小模型,但无法在最简单的情况下重现。我可能会在3-4个小时后得到它。为了加快进度,我真的想知道我是否做了什么明显愚蠢的事情。我的初步调查表明可能存在超出范围值(65536+),枚举中可能元素数量的潜在限制,或者Visual Studio本身存在错误。当我打开问题时,它还没有完成编译(最终我将其留过夜),因此没有任何错误消息。 - NapkinTrout
1个回答

4

Angew的分析是正确的。

有一个VoxelTypes :: COUNT元素的静态数组。 每个元素为88字节,总共为5,767,168(5.5 Mb)。

我的解决方法是创建动态数组的数组,而不是使用大量的数组初始化器表。

旧的:

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});

还需要添加一些数学函数来访问数组元素。我认为这是最快的方法。它包含了我的体素的定义,所以我需要经常访问它。(我想我也可以为每个体素属性定义单独的数组,这些数组可能足够小而可以编译。这可能比将所有属性放入一个巨大的数组中更快)

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

不错的分析。点个赞。接受自己的答案没有什么坏处。我会删除我的回答。 - Bathsheba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接