初始化结构的向量需要很长的编译时间

时间:2014-11-16 03:21:30

标签: c++ c++11 vector constructor initialization

我在C ++ 11中编写程序,它分析国际象棋的位置并计算一些有趣的统计数据。我加载的数据被格式化为结构

struct board{
  board(long int hash1,long int hash2);
};

我将所有内容存储在另一个结构中

struct data_struct{
  vector<board> allboards;
  void read_data(char* filename);
  //other member functions
};

以前我正在读取文本文件中的数据,但是我正在使用文件I / O很昂贵的计算机集群,我必须使用不同的设置但相同的数据多次执行相同的程序。所以我认为对数据进行硬编码并重载data_struct的默认构造函数会更有效。所以在一个单独的源文件中我有一个构造函数

data_struct::data_struct(){
  allboards.push_back(board(2315678,6235756));
  allboards.push_back(board(464135138,1563135));
  \\5000 more lines like this 
}

这些数字并不重要,它们是董事会国家的散列。我的问题是编译此代码需要很长时间。我认为问题在于我调用了5000次构造函数,因为如果我只将哈希硬编码为数组,那么编译只需要几秒钟。然而,程序必须在执行时将这些数组转换为向量,这是不优雅的,浪费内存和时间。有没有一种优雅的方法来解决这个问题,例如使用初始化列表?

编辑:我正在使用Mingw-w64进行编译,启用了-O3和-fexpensive-optimizations。没有优化,它就不会变得更快。

2 个答案:

答案 0 :(得分:0)

C ++ 11?我会替换你的data_struct构造函数

data_struct::data_struct(){
  allboards.emplace_back(2315678, 6235756);
  allboards.emplace_back(464135138, 1563135);
  \\5000 more lines like this 
}

......作为最便宜的解决方案。它可能会在一定程度上缩短编译时间,并且肯定应该有助于缩短运行时间。

为了更好的改进,你有必要考虑initialization list,这样你就可以根据需要提供所有这些数字,但这需要对data_struct构造函数进行重要的重做。看看下面的主题......你最终可能希望将其转换为

data_struc someChessData;
someChessData.allboards =
{
{2315678, 6235756},
{464135138, 1563135},
...,
{more_n1, more_n2}
};

更新:当然是初始化列表,我做了上面的修复,只是尝试使用这样的构造分配allboards。

答案 1 :(得分:0)

如果数据不变,我建议使用static const struct个数组。

通常以最有效的方式在main之前初始化数组。编译器可以创建数据表,您的代码可以直接访问数据表。

如果你真的需要一个矢量,你可以从数组中构造一个矢量。