我试图通过在编译时计算数字序列并将它们存储为静态向量来节省计算时间(但我现在可能会在运行时开始时进行一次计算)。我想要做的一个简单(不编译)的例子是:
#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上完成它,但我只看到它用类完成。如果它有助于在编译时进行计算,我可以使用数组而不是向量。
编辑:
虽然建议使用模板元编程,但我的实际生成器算法太复杂了,不适合这种技术。
使用查找表似乎是我唯一能够避免运行时计算的其他选项;如果性能在未来继续成为一个问题,我将依赖于此。
答案 0 :(得分:4)
这样做:
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();
答案 1 :(得分: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();
答案 2 :(得分:0)
不那么容易:std :: vector是一个动态结构。它不是“可填写的”和“编译时间”。它可以在启动时填充,通过返回一个实际填充向量的调用函数或lambda来初始化静态变量。
this可以是一种方式。
但是正确的“编译时vecotr”应该看起来像一个模板,其“索引”是作为参数给出的int,如
template<unsigned idx>
struct THING
{
static const int value = .... //put a costant expression here
};
用作THING<n>::value
。
“常量表达式”可以是function(THING<idx-1>::value)
,递归到专用
temnplate<>
struct THING<0U> {};
停止编译器递归。
但是有一些限制:定义value
静态成员的表达式必须是constexpr(因此,只有整数类型,内置oerations而不是<cmath>
,并且只是声明了函数使用constexpr),用作idx
的值必须是一个常量(不是变量)。