我正在尝试创建一个通用的 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,所以我不知道是否有适合此应用程序的实现。
所以我的问题是:
- 对于这个问题,是否有比 UUID 更好的解决方案?
- 哪种 UUID 实现更适合这个问题?
- boost uuid是一个可能的候选人吗?
- 不幸的是,问题可以解决
Args ...
但不适用于ReturnType
, 那么有没有办法解决memoized result?
注意为对象 x
生成的 UUID即使在不同的运行和机器中也应该相同。
注意,如果我们对两个不同的对象使用相同的 UUID(因此我们返回了错误的值)并且非常的概率很低,那么它是可以接受的。 ..假设这可能是一个“概率内存器”。
我知道这个应用程序在内存上下文中没有意义(用户要求两次对相同的 1000 万个元素 vector 进行排序的几率是多少?),但时间和内存昂贵(非常适合基准测试和介绍我上面提到的内存问题),所以请不要鞭打我,因为这是一个荒谬的内存应用程序。
最佳答案
识别任何对象都很容易。地址是 C++ 中的“对象标识”。这也是即使空类也不能具有零大小的原因。
现在,您想要的是值(value)等价。那绝对不在语言领域。它完全属于应用程序/库逻辑领域。
您应该考虑使用类似boost::flyweights
的东西。它恰恰具有这种功能,可以“轻松”地为您的类型自定义等价语义。
关于c++ - c++中唯一标识任意对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37025160/