两者之间在性能,内存等方面是否存在显着差异:

  • #1 :将指针移至临时指针,将其移回,然后删除该临时指针
  • #2 :将指针复制到临时指针,然后删除该临时指针

  • 我有以下代码,允许将对象的两个指针BaseDerived(从Base派生)存储在Base对象的指针 vector 中,当读取 vector 时,我需要检查是否需要dynamic_pointer_cast指针,因此数据不会被分割。
    #include "Base.h"
    #include "Derived.h"
    
    class Base
    {
    public:
        Base() {};
        ~Base() {};
    };
    
    class Derived: public Base
    {
    public:
        Derived() {};
        ~Derived() {};
    };
    
    int main()
    {
        std::vector<std::shared_ptr<Base>> vectorOfBaseObjects;
    
        std::shared_ptr<Base> base = std::make_shared<Base>();
        std::shared_ptr<Derived> derived = std::make_shared<Derived>();
    
        vectorOfBaseObjects.push_back(base);
        vectorOfBaseObjects.push_back(derived);
    
        for (auto &it : vectorOfBaseObjects) {
            // #1: Move pointer to a temporary location and move it back when done
            if (std::shared_ptr<Derived> tmp_ptr = std::move(std::dynamic_pointer_cast<Derived>(it))) {
                // Do something with the derived object
                it = std::move(tmp_ptr);
            }
    
            // #2: Create a new temporary pointer
            if (std::shared_ptr<Derived> tmp_ptr = std::dynamic_pointer_cast<Derived>(it)) {
                // Do something with the derived object
            }
        }
    }
    

    两种说法都很好,我唯一可以解决的问题是
  • #1 :在极少数情况下,多线程应用程序中缺少指针位置,这可能会成为问题。
  • #2 :在内存中分配的另一个位置,这根本不是问题。
  • 最佳答案

    这两种情况几乎相同,因为std::dynamic_pointer_cast()返回一个新的共享指针。 it不会从此表达式中移出:

    std::move(std::dynamic_pointer_cast<Derived>(it))
    

    强制转换的结果已经是一个xvalue,因此与
    std::dynamic_pointer_cast<Derived>(it)
    

    唯一的区别是指向it的指针的副本。如果您没有更改其指向的内容,那将是浪费的声明。

    关于c++ - 两次移动智能指针与复制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59103805/

    10-11 22:43
    查看更多