gpt4 book ai didi

不使用静态存储的基于 C++ 类型的缓存

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:51 30 4
gpt4 key购买 nike

我正在使用类似的东西:

struct VectorCache
{
template<typename T>
std::vector<T>& GetTs()
{
static std::vector<T> ts;
return ts;
}
};

根据包含的类型创建/访问一些 vector 。只要我只有一个 VectorCache 类型的对象,这就可以正常工作,但是当我使用多个对象时,我将从 VectorCache 的所有实例中获得相同的 vector 因为 vector 是静态变量。

我尝试使用类似于 boost::any 的方法将 vector 作为成员变量移动并使用 std::type_index 访问它们T,但这比我之前使用的直接访问要慢一些。

另一种选择是转换struct VectorCache类似于 template<int index> struct VectorCache ,但问题仍然存在——我必须小心,只有一个实例/索引才能有正确的行为。

是否可以直接根据 T 访问 vector 并且还具有基于缓存实例而不是基于类的缓存?

最佳答案

您可以尝试使用未经检查的 Boost.Any 类似物。看看这对你来说是否足够快(虽然我不认为这会有很大的不同):

#include <memory>
#include <type_traits>
#include <typeindex>
#include <unordered_map>
#include <vector>

class AnyCache
{
struct TEBase
{
virtual ~TEBase() {}
virtual void * get() = 0;
};

template <typename T> struct TEObject : TEBase
{
T obj;
virtual void * get() override { return static_cast<void *>(&obj); }
};

std::unordered_map<std::type_index, std::unique_ptr<TEBase>> cache;

public:
AnyCache(AnyCache const &) = delete;
AnyCache & Operator=(AnyCache const &) = delete;

template <typename T> decltype(auto) get()
{
using U = std::decay_t<T>;
using C = std::vector<U>;

std::unique_ptr<TEBase> & p = cache[typeid(U)];
if (!p) { p = std::make_unique<TEObject<C>>(); }
return *static_cast<C *>(p->get());
}
};

用法:

AnyCache ac;
ac.get<int>().push_back(20);
ac.get<std::string>().push_back("Hello");
for (auto const & x : ac.get<Foo>()) { std::cout << x << '\n'; }

关于不使用静态存储的基于 C++ 类型的缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26359642/

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