对于静态初始化的大数组(例如65536条目),编译时间非常长

Compilation time is huge for statically initialized large array(e.g.65536 entry)

本文关键字:编译 65536条目 时间 非常 例如 于静态 静态 初始化 数组      更新时间:2023-10-16

我想初始化.cpp文件中的结构的全局数组。我的数组大小约为70000。每个结构将包含两个指针(每个指针的大小为4字节)。cpp初始化后的文件大小超过1 MB。除了这个大的全局数组,我还有几个(10)小变量(10-20字节)。

当我在VisualStudio2005中编译这个文件时,编译大约需要10分钟。但是,当我将这个70000个条目的数组分解为两个35000个条目的阵列时,编译时间变为5分钟(原始构建时间的一半)。但由于项目的限制,我不想在多个小数组中破坏全局数组。但是我们也想减少编译时间。请告诉我们是否有一些编译优化技巧或编码技巧可以降低编译时间。

    Struct node
    {
    char* name;
    int* ptr;
    }
    typedef Struct node NODE;
    NODE invalidNode = {invalidNodeName,NULL};
    NODE nodelist_10_nodeArray[] = {{"PETER",NULL},
                    invalidNode,
                    invalidNode,
                    invalidNode,
                    {"George",NULL}
                    {"SUNDAR",NULL}
                    invalidNode,
                    ...,
                    ...,
                    ...,
                        },

注意:我们有很多无效条目。

您可以用空条目设置数组,然后填充有效条目。

或者(可能不可移植的恶心破解),你可以假设单个数组将在内存中连续出现,然后无论如何都会将它们分解。

也就是说:

NODE nodelist_10_nodeArray[] = { half the data };
NODE nodelist_10_nodeArray1[] = { the other half of the data };

如果您还没有检查数组边界,那么这个/应该/有效。但我会在你的源代码中,在每一节之前、之后和之间,附上一条非常非常明显的评论,说这是一个恶心的黑客攻击。

但几乎任何其他解决方案都是可取的,因为这依赖于实现定义行为。

如果有很多无效条目应该返回相同的值,那么应该考虑使用某种字典。

您可以使用std::map<int, NODE>并在运行时填充它(仅使用有效条目)。但是在运行时填充它可能是一个性能问题(您需要更多的内存,这取决于有效项和无效项的比例)。对特定索引的查找也会更慢,它们将采用O(log(n)),而不是O(1)

另一个解决方案:使用new在堆上创建数组并填充它。您可以在运行时从文件中填充它。

第一个问题是这个数组是否需要是静态的?但如果是这样,那么您可以在编译时分配空间,但在运行时从文件中填充数组?

如果你有很多无效条目,那么你可能会考虑某种哈希容器,前提是你不依赖随机访问。