两者之间在性能,内存等方面是否存在显着差异:
我有以下代码,允许将对象的两个指针
Base
和Derived
(从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
}
}
}
两种说法都很好,我唯一可以解决的问题是
最佳答案
这两种情况几乎相同,因为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/