gpt4 book ai didi

c++ - 基于通话位置的内存

转载 作者:太空宇宙 更新时间:2023-11-04 12:58:28 25 4
gpt4 key购买 nike

我有一个带有两个参数的成员函数。两者都是指向复杂对象的指针。调用时,该函数执行一些重要的计算,然后返回一个整数。像这样:

struct Fooer {
int foo(const A* a, const B* b);
};

如果 foo() 被赋予相同的两个参数,则返回的整数始终相同。这个函数被大量使用,所以记住它的结果是有意义的。通常,一些以指针对为键的查找表就足够了。但是,我处于一个独特的位置,我知道所有的调用站点,并且我知道任何给定的调用站点在执行期间总是使用同一对参数。如果我可以传入一个第三个​​参数,这可以大大加快内存,一个唯一的整数,基本上是缓存提示:

struct Fooer {
int foo(const A* a, const B* b, int pos) {
if (cached_[pos] > 0) return cached_[pos];
cached_[pos] = /* Heavy computation. */ + 1;
return cached_[pos];
}

std::vector<int> cached_;
};

我正在寻找的是一种可以轻松生成此“缓存提示”的机制。但是什么也没有想到。现在,我手动将此参数添加到 foo() 的调用位置,但它显然丑陋且脆弱。该函数确实被大量使用,因此值得进行这种优化,以防您感到疑惑。

更一般地说,我希望在第一次调用时执行繁重工作的每个调用站点都有某种“thunk”,然后只返回预先计算的整数。

注意 foo() 是一个成员函数,因此不同的 Fooer 实例应该有不同的缓存。

最佳答案

这种方法对您有帮助吗?

struct Fooer {

using CacheMap = std::map<std::pair<const A*, const B*>, int>;
std::map<int, CacheMap> lineCache;

int foo(const A* a, const B* b, int line) {
const auto key = std::make_pair(a,b);
if (linecache.count(line) > 0) {
CacheMap& cacheMap = lineCache[line];
if(cacheMap.count(key)) return cacheMap[key];
}
lineCache[line][key] = /* Heavy computation. */ + 1;
return cacheMap[key];
}

};

// Calling
foo(a, b, __LINE__)

关于c++ - 基于通话位置的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45448438/

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