c++中唯一标识任意对象

Uniquely identify an arbitrary object in c++

我正在尝试为多个任意函数创建一个通用 memoizator

对于我们想要记忆的每个函数 std::function<ReturnType(Args...)>,我们 unordered_map<Args ..., ReturnType>(我故意让事情简单化)。

当我们的 memoized 函数有一些非常大的参数时,大问题就来了 Args ...:例如,假设我们的函数对 1000 万个数字的向量进行排序,然后 return 对排序后的向量进行排序,所以像 std::function<vector<double>(vector<double>)>

可以想象,在插入不到 100 个向量后,我们已经填满了 8 GBS 的内存。请注意,这可能是由巨大的向量和排序算法所需的内存的组合给出的(我没有调查原因)。

那么如果我们定义 unordered_map<UUID(Args ...), ReturnType>(其中 UUID= Universally Unique Identifier)而不是上述结构呢?我们应该放松确定性特征(所以也许我们 return 一个错误的错误),但概率非常低。

问题是因为我从来没有使用过UUID,所以我不知道这个应用程序是否有合适的实现。

所以我的问题是:

  1. 这个问题有比 UUID 更好的解决方案吗?
  2. 哪个 UUID 实现更适合这个问题?
  3. boost uuid 是一个可能的候选人吗?
  4. 不幸的是,Args ... 的问题可以解决,但 ReturnType 的问题无法解决,所以有解决方案吗?

注意为对象x生成的UUID即使在不同的运行和机器中也应该相同。

注意 如果我们对两个不同的对象有相同的 UUID(因此我们 return 错误的值)真的 概率低,那么可以接受...假设这可能是 "probabilistic memoizator".

我知道这个应用程序在记忆上下文中没有意义(用户要求两次对相同的 1000 万个元素向量进行排序的几率是多少?) , 但它的时间和内存都很昂贵(非常适合基准测试和介绍我上面提到的内存问题),所以请不要鞭打和钉死我,因为这是一个荒谬的记忆应用程序。

识别任何对象都很容易。该地址在 C++ 中为 "object identity"。这也是即使空 类 也不能具有零大小的原因。

现在,您想要的是价值等价。那绝对不在语言领域。它完全属于 application/library 逻辑域。

您应该考虑使用 boost::flyweights 之类的东西。它恰好具有此功能,并且可以 "easy" 为您的类型自定义等价语义。