【问题标题】:Smart pointers and cache/memory locality智能指针和缓存/内存局部性
【发布时间】:2017-02-16 21:42:27
【问题描述】:

我试图在局部性上下文中理解智能指针。我在 S/O 上查看了几个关于将 std::vectorMyObjects 和 std::vector 的智能指针 (shared_ptr/unique_ptr) 指向 MyObjects 的问题。

我没有找到答案的是,如果我有一个包含 1000 个指向 MyObjects 的智能指针的向量(使用 make_shared/make_unique),对象本身是否存储在内存中的随机位置?智能指针存储在向量中的连续内存块中,还是指针和对象都存储在向量中的连续内存块中?

【问题讨论】:

    标签: c++11 pointers vector shared-ptr unique-ptr


    【解决方案1】:

    至少保证向量中的元素是连续存储的。这是根据最近的 C++ 标准。

    智能指针指向的对象存储在其他地方。这将取决于您的对象将在哪里结束的内存管理器。

    如果您有选择,将对象直接存储到向量中可能会更好(更快)。指针会增加一个额外的间接层,这可能会减慢您的程序速度。

    【讨论】:

    • 如何确保智能指针指向的对象也存储在某个连续的内存块中或尽可能接近?我需要编写自己的分配器吗?
    • 是的,您确实必须这样做。但这听起来像是重新发明了向量类本身。你能解释一下你真正想要达到的目标吗?为什么不简单地将所有对象推送到向量?
    • 更快的迭代,并且由于存储的对象很大,拥有一个指向对象的向量比对象本身要好得多,因为随着向量的增长复制/移动对象的成本很高,而且智能指针负责管理对象的生命周期。 @E。范普滕
    • 我已经实现了自己的向量类,并使用 std::allocator 来分配()、构造()和解除分配()对象。我不确定如何让它将智能指针指向的对象也存储在一个连续的块中。 std::vector 也一样,所以我相信可以做一些可以用于两种向量实现的东西。
    • 啊,我明白了。数据本身会改变吗?为什么不在各种实现上运行一些基准测试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 2013-04-16
    相关资源
    最近更新 更多