我想在.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,
...,
...,
...,
},
注意:我们有很多无效的条目。
答案 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 };
如果你没有检查数组边界,这个/应该/工作。但是我会在你的源代码中包含一个非常非常明显的注释,在每个部分之前,之后和之间,这是一个恶心的黑客。
但几乎任何其他解决方案都是可取的,因为它依赖于实现定义行为。