【发布时间】:2015-05-28 19:06:44
【问题描述】:
我有几个简单的“表达式”类派生自
namespace Expression {
class Virtual {
public:
Virtual();
~Virtual();
virtual
double eval(double x, double y, double z) const = 0;
}
}
例如
class MyFun: public Virtual {
public:
MyFun();
~MyFun();
virtual
double eval(double x, double y, double z) const
{
return sin(x*x) + exp(z)*y + 3.0; // some expensive expression
}
}
这些表达式在许多evaled 中,但非常具体xyzs,即网格的节点
class MyMesh {
MyMesh();
~MyMesh();
virtual
std::vector<std::vector<double> > getNodes() const
{
return allMyNodes_;
}
}
被调用者将实例化一个网格,实例化一个Expression,然后继续执行一些数值过程,其中Expression 可能在网格节点中被计算多次。
MyMesh myMesh();
MyFun myExpr();
Result result = numericalProcedure(myMesh, myExpr);
// [...]
由于eval 很贵,所以我考虑了如何加快速度。想到的是缓存。
一个想法是将所有eval 结果存储在带有一些索引的向量中的所有网格节点中,我想知道如何最好地实现这一点。我不想在Expressions 中粘贴任何网格数据(将缓存保留在那里),也不想让被调用者的界面更加复杂。
是否有与此用例匹配的缓存设计模式?有哪些方法可以将缓存逻辑与其余代码隔离开来?
【问题讨论】:
-
你的
MyFun实际上是从Virtual派生的吗?您的代码似乎没有这样做。 -
大概
MyMesh myMesh();应该是MyMesh myMesh;,声明一个对象而不是一个返回对象的函数?