【发布时间】:2016-12-08 08:49:29
【问题描述】:
在一个相当大的应用程序中,我想跟踪有关某个类的对象的一些统计信息。为了不降低性能,我希望在拉取配置中更新统计信息。因此,我需要在某个位置引用每个活动对象。是否有一种惯用的方式来:
- 创建、搜索、迭代此类引用
- 自动管理(即在销毁时删除引用)
我在这里考虑的是一组智能指针,但是内存管理会有些颠倒:我不想在智能指针被销毁时销毁对象,而是希望智能指针被删除,当对象被销毁。理想情况下,我不想重新发明轮子。
我可以忍受删除指针的延迟,我只需要一种方法来快速使它们无效。
edit:因为稻谷要求它:基于拉取的收集的原因是获取信息可能相对昂贵。推送显然是一个干净的解决方案,但被认为过于昂贵。
【问题讨论】:
-
你需要什么样的统计数据?如果它只是跟踪活动实例的计数,那么考虑为每个类存储一个原子整数,并可能制作一个简单的 RAII 包装器来进行计数(这意味着您只需将其放入类定义中即可完成工作)。
-
如果有任何用处,here's a simple example 我在说什么。它不允许您迭代或搜索您的对象,但不清楚您为什么要这样做。以这种方式访问另一个堆栈可能不是一个好主意。这个例子只是提供了具有非常低开销和线程安全的对象计数。
-
这基本上是一个推送更新,但被认为太昂贵了。
-
更新单个原子将比跟踪所有内存分配和按需提供线程安全统计信息要便宜得多。
-
嗯,看,我不知道。你实际上并没有告诉我们你想要什么统计数据,所以我不得不假设你想要数数。我确实问过,你没有发表评论,所以我认为我已经正确推断出你的意图。除非您提供真实信息,否则我更倾向于将此视为 XY 问题。
标签: c++ pointers reference global