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

时间:2016-05-04 10:31:26

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

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

对于我们想要记忆的每个函数@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_two, container, false); } public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); TextView titolo2 = view.findViewById(R.id.quantità2); Bundle bundle=getArguments(); int myInt = bundle.getInt("totale", 0); titolo2.setText(String.valueOf(myInt)); } ,我们std::function<ReturnType(Args...)>(我故意保持简单。)

当我们的memoized函数有一些非常大的参数unordered_map<Args ..., ReturnType>时,最大的问题出现了:例如,假设我们的函数对一个包含1000万个数字的向量进行排序,然后返回已排序的向量,如{{1} }。

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

那么,如果不是上述结构,我们定义Args ...(其中UUID =通用唯一标识符)?我们应该放松确定性特征(所以我们可能会返回错误的错误),但概率非常低。

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

所以我的问题是:

  1. 对于这个问题,存在比UUID更好的解决方案吗?
  2. 哪种UUID实施更适合此问题?
  3. boost uuid是否可能成为候选人?
  4. 不幸的是,问题可以解决std::function<vector<double>(vector<double>)>但问题不能解决unordered_map<UUID(Args ...), ReturnType>,所以有一个记忆结果的解决方案吗?
  5. 注意,即使在不同的运行和计算机中,为对象Args ...生成的UUID也应该相同。

    注意如果我们对两个不同的对象具有相同的UUID(因此我们返回错误的值)并且真的概率很低,那么它可以接受。 ..let说这可能是一个“概率记忆者”。

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

1 个答案:

答案 0 :(得分:3)

识别任何对象都很容易。地址是&#34;对象标识&#34;在C ++中。这也是即使是空类也不能为零的原因。

现在,你想要的是价值等值。这完全不在语言领域。它稳固地存在于应用程序/库逻辑域中。

您应该考虑使用boost::flyweights之类的内容。它正是这个设施,使它变得简单&#34;定制类型的等价语义。