【问题标题】:Taking really long to compile my C++ code编译我的 C++ 代码需要很长时间
【发布时间】:2019-04-05 04:16:30
【问题描述】:

我有一个很长的初始化列表,像这样。

 std::vector<Inventory> inventory_list = {Inventory(0,30.0),
    Inventory(1,30.0),
    Inventory(2,30.0),
    Inventory(3,30.0),
    Inventory(4,30.0),
    Inventory(5,30.0),
    Inventory(29,30.0),
    Inventory(30,30.0),}

 ..... 

有大约 72000 行这样的初始化列表,它已经花费了半个多小时并且仍在编译。有没有办法让它更快?或者这是对如此大量数据的预期?

【问题讨论】:

  • 可怜的编译器,要经过这72,000行,半小时没有休息……请结束它的痛苦。
  • 为什么不用for循环从文件中加载这么大的初始化列表呢?另外,您使用的是哪个编译器?
  • 你不能写一个简单的循环来填充数据结构吗?还是在运行时从文件中加载数据?
  • 碰巧inventory_list是一个全局变量,您在全局命名空间(而不是函数体)中初始化?
  • 这东西有什么用?为什么不能将其存储在更方便的文件中,例如二进制文件、CSV/JSON/YAML/XML 文件或 SQLite 之类的数据库中?

标签: c++ c++11 compiler-optimization


【解决方案1】:

将此视为一种解决方法:

struct InitData
{
    int i;
    double v;
};

InitData init[] = { {1,30.0}, {2,30.0}, {3,30.0}, {4,30.0}, {5,30.0}, ...};

std::vector<Inventory> inventory_list;
size_t count = sizeof(init) / sizeof(init[0]);
for (size_t i = 0; i < count; i++)
{
     inventory_list.push_back(Inventory(init[i].i, init[i].v);
}

【讨论】:

  • 为什么编译起来会更快?它仍然是一个包含 72000 个元素的复合类型数组。
  • 可能不建议在没有预分配的情况下调用push_back 数万次。 std::vector 有一个构造函数,可以一次性从数组(或其他任何支持迭代器的数据)中获取所有数据。
  • 怀疑编译器正在努力从具有构造函数参数的异常大的内联对象数组初始化向量。
【解决方案2】:

另一种实现方式,

Inventory I[] = { {1,30.0},{2,30.0},{3,30.0},{4,30.0 },{5,30.0},{29,30.0 },{30,30.0}};

std::vector<Inventory> inventory_list (I,I+(sizeof(I)/sizeof(Inventory)));

【讨论】:

    猜你喜欢
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    相关资源
    最近更新 更多