【问题标题】:Compilation time is huge for statically initialized large array(e.g.65536 entry)对于静态初始化的大数组(例如 65536 条目),编译时间很长
【发布时间】:2012-02-02 10:14:16
【问题描述】:

我想在 .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,
                    ...,
                    ...,
                    ...,

                        },

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

【问题讨论】:

    标签: c++ arrays visual-studio compilation


    【解决方案1】:

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

    或者(可能是不可移植的恶心黑客)您可以假设各个数组将在内存中连续出现并且无论如何都将它们分解。

    也就是说:

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

    如果您没有检查数组边界,这个 /should/ 工作。但我会在你的源代码中包含一个非常非常非常明显的注释,在每个部分之前、之后和之间,这是一个令人作呕的 hack。

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-22
          • 2018-09-07
          • 2021-11-13
          • 2018-02-06
          • 1970-01-01
          • 2017-12-31
          相关资源
          最近更新 更多