4

我试图通过在编译时计算数字序列并将它们存储为静态向量来节省计算时间(但我现在可能会在运行时开始计算一次)。我正在尝试做的一个简单(非编译)示例是:

#include <vector>
using namespace std;

static vector<vector<int> > STATIC_THING(4, vector<int>(4));

void Generator(int x, int y, vector<int> *output) {
  // Heavy computing goes here
  for(int i=0; i < 4; ++i)
    (*output)[i] = x * y;
  return;
}   
static void FillThings() {
  for(int x=0; x < 4; ++x)
    for(int y=0; y < 4; ++y)
      Generator(x, y, &STATIC_THING[x]);
}   
FillThings();

int main() {
}   

除了将我的序列预计算和硬编码到数组中以使编译器对此进行提升之外,还有其他方法吗?我觉得应该有一种方法至少可以在头文件的第一个#include 上完成这项工作,但我只看到它与类一起完成。如果它有助于在编译时进行计算,我可以使用数组而不是向量。

编辑:

  • 尽管有人建议使用模板元编程,但我的实际生成器算法过于复杂,无法使用这种技术。

  • 使用查找表似乎是我唯一可以避免运行时计算的其他选择;如果将来性能仍然是一个问题,我将依靠这一点。

4

3 回答 3

5

做这个:

static int FillThings() {
  for(int x=0; x < 4; ++x)
    for(int y=0; y < 4; ++y)
     Generator(x, y, &STATIC_THING[x]);
  return 9087;
}   
static int q = FillThings();
于 2012-08-27T15:58:38.160 回答
2

如果您无法通过大括号初始化程序从实际文字进行初始化,那么您可以执行以下操作:

typename std::vector<std::vector<int>> my_vector;

static my_vector make_static_data()
{
    my_vector result;
    // ... populate ...
    return result;
}

static const my_vector static_data = make_static_data();
于 2012-08-27T16:03:25.517 回答
0

没那么容易:std::vector 是一个动态结构。它不是“可填充的”和“编译时间”。它可以在启动时通过使用调用函数或 lambda 的返回来初始化静态变量来填充,该函数实际上填充了向量。

可以是一种方式。

但是一个适当的“编译时向量”应该看起来像一个模板,它的“索引”是一个作为参数给出的 int,比如

template<unsigned idx>
struct THING
{
    static const int value = .... //put a costant expression here
};

用作THING<n>::value.

“常量表达式”可以是 a function(THING<idx-1>::value),递归到专门的

temnplate<>
struct THING<0U> {};

这会停止编译器递归。

但是,有一些限制:定义value静态成员的表达式必须是 constexpr(因此,只有整数类型、内置操作和 no <cmath>,并且只有用 constexpr 声明的函数),并且使用的值idx本身必须是 a常数(不是变量)。

于 2012-08-27T16:08:53.207 回答