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,所以我不知道这个应用程序是否有合适的实现。
所以我的问题是:
- 这个问题有比 UUID 更好的解决方案吗?
- 哪个 UUID 实现更适合这个问题?
- boost uuid 是一个可能的候选人吗?
- 不幸的是,
Args ...
的问题可以解决,但 ReturnType
的问题无法解决,所以有解决方案吗?
注意为对象x
生成的UUID即使在不同的运行和机器中也应该相同。
注意 如果我们对两个不同的对象有相同的 UUID(因此我们 return 错误的值)真的 概率低,那么可以接受...假设这可能是 "probabilistic memoizator".
我知道这个应用程序在记忆上下文中没有意义(用户要求两次对相同的 1000 万个元素向量进行排序的几率是多少?) , 但它的时间和内存都很昂贵(非常适合基准测试和介绍我上面提到的内存问题),所以请不要鞭打和钉死我,因为这是一个荒谬的记忆应用程序。
识别任何对象都很容易。该地址在 C++ 中为 "object identity"。这也是即使空 类 也不能具有零大小的原因。
现在,您想要的是价值等价。那绝对不在语言领域。它完全属于 application/library 逻辑域。
您应该考虑使用 boost::flyweights
之类的东西。它恰好具有此功能,并且可以 "easy" 为您的类型自定义等价语义。
我正在尝试为多个任意函数创建一个通用 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,所以我不知道这个应用程序是否有合适的实现。
所以我的问题是:
- 这个问题有比 UUID 更好的解决方案吗?
- 哪个 UUID 实现更适合这个问题?
- boost uuid 是一个可能的候选人吗?
- 不幸的是,
Args ...
的问题可以解决,但ReturnType
的问题无法解决,所以有解决方案吗?
注意为对象x
生成的UUID即使在不同的运行和机器中也应该相同。
注意 如果我们对两个不同的对象有相同的 UUID(因此我们 return 错误的值)真的 概率低,那么可以接受...假设这可能是 "probabilistic memoizator".
我知道这个应用程序在记忆上下文中没有意义(用户要求两次对相同的 1000 万个元素向量进行排序的几率是多少?) , 但它的时间和内存都很昂贵(非常适合基准测试和介绍我上面提到的内存问题),所以请不要鞭打和钉死我,因为这是一个荒谬的记忆应用程序。
识别任何对象都很容易。该地址在 C++ 中为 "object identity"。这也是即使空 类 也不能具有零大小的原因。
现在,您想要的是价值等价。那绝对不在语言领域。它完全属于 application/library 逻辑域。
您应该考虑使用 boost::flyweights
之类的东西。它恰好具有此功能,并且可以 "easy" 为您的类型自定义等价语义。