gpt4 book ai didi

c++ - 两次移动智能指针与复制

转载 作者:行者123 更新时间:2023-11-30 01:33:07 24 4
gpt4 key购买 nike

在性能、内存等方面是否存在显着差异:

  • #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() 返回一个新的共享指针。 没有从这个表达式中移出:

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

转换的结果已经是一个xvalue,所以这和

完全一样
std::dynamic_pointer_cast<Derived>(it)

唯一的区别是指针的拷贝返回到。如果您没有更改它指向的内容,那么这是一个浪费的声明。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com