c++ - 从 std::unique_ptr<Dervied> 到 std::unique_ptr<Base> 的转换成本是多少?

标签 c++ c++11

考虑一段简单的代码:

class Base {};
class Derived : public Base {};

std::unique_ptr<Base> foo()
{
    return std::make_unique<Derived>();
}

我知道std::unique_ptr类似于继承,可以很好地管理相关类型的转换。但是,std::unique_ptr<Base> 是真的吗?和 std::unique_ptr<Derived>实际上是不相关的,并且由于转换而不是继承,所提供的代码是可能的(并且有效)?

如果是这样的话,这种转换肯定是有代价的。我假设从 Derived& 转换至 Base&是免费的。这是std::unique_ptr吗花了我多少钱?


注意:问题是基于存在函数的假设:

  • 这叫很多,
  • 可以通过上述转换来实现,或者以更肮脏的方式实现:return std::unique_ptr<Base>(new Derived()); ,
  • 性能为王。

最佳答案

转换应该基本上是免费的; std::unique_ptr只是一个指针的包装器,指针之间的“转换”存储在std::unique_ptr<Derived>中和 std::unique_ptr<Base>是纯粹形式的(即它只发生在类型系统中),实际值未受影响。

这很容易看出in the generated code ,归结为将指针和删除器复制到新的 std::unique_ptr 中并将旧指针中的指针归零。

关于c++ - 从 std::unique_ptr<Dervied> 到 std::unique_ptr<Base> 的转换成本是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39387065/

相关文章:

c++ - C++中函数返回的值是右值吗?无法使用复制/move 构造函数初始化实例

c++ - parallel_for (Inter TBB) 是否存在类似于我们在 std::function 上看到的开销?

c++ - 无法将派生类存储在基类指针的 vector 中

c++ - boost::lexical_cast 对于 c++11 stoi、stof 和 family 是否是多余的?

c++ - 基本 I/O 在 Visual C++ 2010 中不起作用?

c++ - gcc 要求使用 -std=c++11 即使我已经在使用它

c++ - 为什么 union 的规模比预期的要大?

c++ - 将 nullptr 传递给 std::string::assign 是否有效?

c++ - 提升 : read_until "\n" reads until ""

c++ - 在数组中找到两个最小 int64 元素的最快方法