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

标签 c++ c++11 boost uuid memoization

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

对于每个函数 std::function<ReturnType(Args...)>我们想要内存,我们unordered_map<Args ..., ReturnType> (我故意让事情变得简单)。

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

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

那么如果我们定义 unordered_map<UUID(Args ...), ReturnType> 而不是上面描述的结构呢? (其中 UUID= Universally Unique Identifier)?我们应该放宽确定性特征(这样我们可能会返回一个错误的错误),但概率非常低。

问题是,由于我从未使用过 UUID,所以我不知道是否有适合此应用程序的实现。

所以我的问题是:

  1. 对于这个问题,是否有比 UUID 更好的解决方案?
  2. 哪种 UUID 实现更适合这个问题?
  3. boost uuid是一个可能的候选人吗?
  4. 不幸的是,问题可以解决 Args ...但不适用于 ReturnType , 那么有没有办法解决memoized result?

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

注意,如果我们对两个不同的对象使用相同的 UUID(因此我们返回了错误的值)并且非常的概率很低,那么它是可以接受的。 ..假设这可能是一个“概率内存器”。

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

最佳答案

识别任何对象都很容易。地址是 C++ 中的“对象标识”。这也是即使空类也不能具有零大小的原因。

现在,您想要的是值(value)等价。那绝对不在语言领域。它完全属于应用程序/库逻辑领域。

您应该考虑使用类似boost::flyweights 的东西。它恰恰具有这种功能,可以“轻松”地为您的类型自定义等价语义。

关于c++ - c++中唯一标识任意对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37025160/

相关文章:

c++ - 如何更新项目中的所有 C/C++ 标识符名称

c++ - 自定义 win32 拖放,无法更改无效(斜线圆圈)光标

c++ - 将 char* 传递给 pthread_read 函数

C++ 位运算 : How to decode/decompress char to int, 并显示正确的字符串?

c++ - 初始化一个包含自身 vector 的结构

c++ - 在 C++ 中标记 "Braced Initializer List"样式的字符串(使用 Boost?)

c++ - 使用 boost::bind 的调用错误没有匹配函数

c++ - Windows下"Standard I/O only"权限

c++ - std::round 不是 std on android 的成员

c++ - 将 STL 容器用于 boost::interprocess::managed_shared_memory