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

时间:2012-02-02 10:14:16

标签: c++ arrays visual-studio compilation

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

当我在Visual Studio 2005中编译此文件时,编译大约需要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,
                    ...,
                    ...,
                    ...,

                        },

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

或者(令人恶心的黑客可能不便携)你可以假设各个数组会连续出现在内存中,无论如何都会将它们分解。

也就是说:

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

如果你没有检查数组边界,这个/应该/工作。但是我会在你的源代码中包含一个非常非常明显的注释,在每个部分之前,之后和之间,这是一个恶心的黑客。

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