C ++中的原始指针管理

时间:2010-11-23 10:17:31

标签: c++ linux

我有一段性能关键代码。类和对象相当大,因此,它将作为指针存储在STL容器中。当指向对象的指针需要基于某些逻辑存储在多个不同的容器中时出现问题。处理对象的所有权非常麻烦,因为我无法将对象的所有权隔离到单个容器(我可以从单个容器中删除)。除了使用智能指针(因为它是性能关键和智能指针可能会影响性能),我该怎么办?

感谢。

4 个答案:

答案 0 :(得分:5)

你要求不可能 - 从某一点来说,你要求出色的表现,这样你所声称的智能指针无法提供,而且你也碰巧要求安全和整洁。好吧,实际上,一个是以另一个为代价的。当然,您可以尝试编写自己的共享指针,它比boost更轻,但仍然提供基本功能。顺便说一句,你真的试过 boost :: shared_ptr? 实际是否会降低性能?

答案 1 :(得分:1)

你的问题非常尴尬:你要求用凌乱的逻辑来表现?

shared_ptr具有令人难以置信的性能,真的,虽然你可以变得更好,但它可能是你最好的选择:它有效。

你可以查找另一个Boost智能指针:boost::intrusive_ptr

这是以上述成本完成的:weak_ptr并且交换允许为计数器和对象分配单个内存。收拾两者会使性能小幅提升。

如果您没有循环引用,请尝试检查它,它可能就是您要找的。

答案 2 :(得分:0)

侵入式智能指针通常比普通智能指针更有效,但比哑指针更容易。例如,请查看boost::intrusive_ptr<T>

答案 3 :(得分:0)

如果对象不相互引用,则手动引用计数可能值得尝试。添加到列表或从列表中删除会有更多成本,但实际对象访问没有开销。 (如果你弄错了,这可能很难诊断,所以我建议小心把它弄好。)

如果操作之间有空闲时间,请考虑一种垃圾收集。维护所有对象的列表(可能会有一个侵入式列表)。如果您有空闲时间,请将其与其他列表进行交叉引用;任何不在列表中的对象都可以被删除。你不需要一个额外的数组来做这个(只是一个全局计数器和每个对象上最后看到的计数器)所以它可以合理有效。

另一种选择是使用智能指针来提供对底层指针的访问。如果你试图避免大量调用重载operator->的开销,那么这可能值得尝试。将智能指针存储在列表中(这将为您执行生命周期管理),然后在运行对象时,您可以检索每个对象的原始指针并使用它进行操作(这样您就不会产生任何重载的开销{{1等等)。例如:

operator->

这是我个人喜欢的方法。长期存储获得智能指针,短期存储获得普通指针。对象的生命周期很容易管理,并且你不会犯下1,000,000个微小的开销(对于保持调试版本的运行速度比发布版本更重要,但它很容易增加浪费的时间)。