gpt4 book ai didi

c++ - 如何在类之间共享昂贵的计算?

转载 作者:行者123 更新时间:2023-11-30 01:51:30 26 4
gpt4 key购买 nike

举个例子,我有这种情况,其中类 AB 执行相同的昂贵计算,函数 expensiveFunction。这个函数是“纯”的,因为我可以保证在给定相同输入的情况下它会给出相同的结果。客户端可以使用具有相同输入的两个类(或更多类似的类),我希望只计算一次昂贵的函数。但是,客户端也可以只对给定的输入使用一个类。

代码示例:

class A {
public:
A(const InputData& input) {
res = expensiveFunction(input);
}
void foo(); //Use the expensive result
private:
ExpensiveResult res;
};

class B {
public:
B(const InputData& input) {
res = expensiveFunction(input); //Same function as in A
}
double bar(); //Use the expensive result
private:
ExpensiveResult res;
};

int main() {
//Get some input
//...
A a(input);
B b(input);

//Do stuff with a and b

//More input

A a2(otherInput);
//...
}

在某些语言中,由于引用透明和内存,它可以安全地为给定的输入仅计算一次。

我想到的是使用某种排序工厂方法/类,或者为存储结果的 AB 类提供函数对象/仿函数/暂停.

有哪些好的设计思路可以解决这个问题?

我拥有所有代码,因此我可以根据需要更改客户端或服务类。

最佳答案

您可以在函数内部进行内存

COutput expensive(CInput input) {
static std::map<CInput, COutput> memoized_result;
auto resit = memoized_result.find(input);
if (resit == memoized_result.end()) {
// ... do calculations
output = expensiveCalculation(input);
resit = memoized_result.insert(std::make_pair(input, output));
}
return resit->second;
}

您的计算结果存储在静态映射 (memoized_result) 中,并在函数调用之间保留。

如果输入太昂贵而无法用作 map 中的键,您可以创建一个单独的类来处理计算结果,并在所有客户端之间共享:

#include <memory>
using namespace std;
class ExpensiveResult {
public:
ExpensiveResult(int input) {
out_ = input+1;
}
int out_;
};

class BaseCompResultUser {
public:
BaseCompResultUser(const std::shared_ptr<ExpensiveResult>& res) {
res_ = res;
}

private:
std::shared_ptr<ExpensiveResult> res_;
};

class A : public BaseCompResultUser {
public:
A(const std::shared_ptr<ExpensiveResult>& r) : BaseCompResultUser(r) { }
};

class B : public BaseCompResultUser {
public:
B(const std::shared_ptr<ExpensiveResult>& r) : BaseCompResultUser(r) { }
};

int main() {
std::shared_ptr<ExpensiveResult> res(new ExpensiveResult(1));
A a(res);
B b(res);
return 0;
}

这将强制在对象之间共享计算结果。

关于c++ - 如何在类之间共享昂贵的计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26102105/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com