繁体   English   中英

C ++中的原始指针管理

[英]Raw Pointer Management in C++

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

谢谢。

您要求的是不可能的事情-从某一方面讲,您是在要求卓越的性能,以至于您声称无法提供的智能指针,并且您还恰巧要求安全和整洁。 好吧,实际上是以一个为代价的。 当然,您可以尝试编写自己的共享指针,该共享指针比boost的指针更轻巧,但仍提供基本功能。 顺便说一句,您是否实际尝试过 boost :: shared_ptr? 实际上降低了性能吗?

您的问题很尴尬:您是否要求逻辑混乱?

实际上, shared_ptr性能令人难以置信,尽管您可以变得更好,但这可能是您的最佳选择:它可以工作。

不过,您可以查找另一个Boost智能指针: boost :: intrusive_ptr

这是以前述代价为代价的: weak_ptr作为交换,允许为计数器和对象都具有单个内存分配。 将两者组合在一起,可以显着提高性能。

如果您没有循环引用,请尝试将其检出,这可能正是您想要的。

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

如果对象之间没有相互引用,则可能需要尝试手动引用计数。 添加到列表或从列表中删除时会花费更多,但实际对象访问没有开销。 (如果发现错误,这可能会很痛苦地进行诊断,因此,我建议谨慎处理。)

如果两次操作之间有停滞时间,请考虑进行某种垃圾收集。 维护所有对象的列表(侵入列表可能会这样做)。 如果您有时间,可以将其与其他列表进行交叉引用。 不在列表中的任何对象都可以删除。 您不需要额外的数组来执行此操作(只需在每个对象上使用全局计数器和最后看到的计数器),这样它就可以相当有效。

另一个选择是使用提供对基础指针的访问的智能指针。 如果您想避免过多地调用重载的operator->的开销,那么可能值得尝试。 将智能指针存储在列表中(这将为您进行生命周期管理),然后在运行对象时,您可以检索每个对象的原始指针并使用该指针进行操作(因此,不会产生任何重载的operator->的开销。等等。)。 例如:

std::vector<smart_ptr<T> > objects;

if(!objects.empty()) {
    smart_ptr<T> *objects_raw=&objects[0];
    for(size_t n=objects.size(),i=0;i<n;++i) {
        T *object=objects_raw[i].get_ptr();

        // do stuff
    }
}

我个人更喜欢这种方法。 长期存储获得智能指针,短期存储获得普通指针。 对象的生存期易于管理,并且不会造成1,000,000的微小开销(对于保持调试版本的运行性比发布版本的运行更重要,但尽管如此,它很容易浪费时间)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM