C ++ std :: shared_ptr参考的reinterpret_cast优化

迈克·威尔

您有Animal和和DogDog那里继承Animal)的两个类,并且您遇到的情况是经常期望有动物,但正在发送狗的实例。在我的特定情况下,我经常将强力指针(std::shared_ptr<Dog>)转换为期望动物的函数(std::shared_ptr<Animal>)。

如果我们接受可以将函数参数作为引用(std::shared_ptr<Animal>&,避免使用参数,因为担心更改线程的所有权,为什么不应该将强指针作为引用参数),则我认为我们可以安全地在内存类型上进行强制转换。std::shared_ptr<Dog> dog使用reinterpret_cast<std::shared_ptr<Animal>&>(dog),对吗?

如果是这样,除了线程问题之外还会发生什么?例如参考计数品种?

明确地说,目的是要有一种可以在很多情况下使用的解决方案,在这种情况下,一次转换并不是真正可行的解决方案。更为重要的是,必须铸造许多对象。同样,忽略它std::unique_ptr可能是一个更好的解决方案也可能不是一个更好的解决方案。

为了增加最终的要求,在使用std::shared_ptr通用的序列化器类函数(它是虚拟的,因此无法进行模板化)的情况下,使用普通指针将不允许我更改原始指针

埃雷里卡

我经常在使用强力指针(std::shared_ptr<Dog>)来表示期望动物的功能(std::shared_ptr<Animal>)。

无需强制转换(即显式转换)。指向派生类型的共享指针可以隐式转换(1)到指向基类的共享指针。

(a)如果我们接受可以将函数参数作为参考

如果满足一些要求,我们只能接受此假设。首先,该函数不得将引用的参数存储在该函数的范围之外(通过复制除外)。其次,作为引用传递的指针必须是本地的或临时的-否则,该函数不得调用任何可以直接或间接访问引用的指针的函数。

还请考虑,如果引用是非常量的,则您不能依赖隐式转换(1)。而是必须创建一个单独的正确类型的共享指针(可以使用隐式转换来创建它并传递它。const引用参数或非引用参数都不会出现此问题。

(b)我以为使用std :: shared_ptr狗是安全的reinterpret_cast<std::shared_ptr<Animal>&>(dog),所以对吗?

从标准的角度来看,您建议的演员表并不安全-行为不确定。我看不出假设(b)是如何从假设(a)得出的。


如果在您的情况下可以使用对shared_ptr的引用作为参数,但是由于转换(派生为基,非const为const)而无法避免refcounter的递增/递减,则建议改用裸指针作为参数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用C ++ std :: unique_ptr <>或std :: shared_ptr <>来管理Objective-C对象

来自分类Dev

使用C ++ std :: unique_ptr <>或std :: shared_ptr <>来管理Objective-C对象

来自分类Dev

std :: unordered_map插入错误shared_ptr C ++

来自分类Dev

C ++使用指向std :: shared_ptr的Raw指针

来自分类Dev

std :: unordered_map插入错误shared_ptr C ++

来自分类Dev

C++ 中 std::shared_ptr 数组的工作原理

来自分类Dev

内存无法释放std :: list <std :: shared_ptr <std :: string >> C ++

来自分类常见问题

在C ++中,空std :: shared_ptr和空std :: shared_ptr有什么区别?

来自分类Dev

生成std :: thread时的shared_ptr参考计数

来自分类Dev

C ++ 11 std :: shared_ptr工作正常,但是boost :: shared_ptr崩溃了,这是什么原因引起的?

来自分类Dev

QVariant与std :: shared_ptr

来自分类Dev

QVariant与std :: shared_ptr

来自分类Dev

std :: static_pointer_cast与static_cast <std :: shared_ptr <A >>

来自分类Dev

使用std :: move与std :: shared_ptr

来自分类Dev

使用std :: shared_ptr作为Objective-C中的全局变量

来自分类Dev

C ++ std :: shared_ptr,是否operator =重载以使用复制构造函数?

来自分类Dev

使用std :: shared_ptr作为Objective-C中的全局变量

来自分类Dev

C ++ std :: shared_ptr会初始化类中的其他成员数据

来自分类Dev

传递 std::shared_ptr 作为对 lambda 捕获列表的引用(C++)

来自分类Dev

如何在包装头文件中包装 c++ std::shared_ptr 以便它可以从 c 中调用?

来自分类Dev

std :: move(const shared_ptr参考)是什么意思?

来自分类Dev

拥有std :: make_shared的std :: shared_ptr

来自分类Dev

std :: shared_ptr和继承

来自分类Dev

std :: shared_ptr深层复制对象

来自分类Dev

std :: function和shared_ptr

来自分类Dev

使用* this作为std :: shared_ptr

来自分类Dev

数据与memcpy的std :: shared_ptr分配

来自分类Dev

std :: shared_ptr预分配内存

来自分类Dev

std set of boost :: shared_ptr <string>

Related 相关文章

  1. 1

    使用C ++ std :: unique_ptr <>或std :: shared_ptr <>来管理Objective-C对象

  2. 2

    使用C ++ std :: unique_ptr <>或std :: shared_ptr <>来管理Objective-C对象

  3. 3

    std :: unordered_map插入错误shared_ptr C ++

  4. 4

    C ++使用指向std :: shared_ptr的Raw指针

  5. 5

    std :: unordered_map插入错误shared_ptr C ++

  6. 6

    C++ 中 std::shared_ptr 数组的工作原理

  7. 7

    内存无法释放std :: list <std :: shared_ptr <std :: string >> C ++

  8. 8

    在C ++中,空std :: shared_ptr和空std :: shared_ptr有什么区别?

  9. 9

    生成std :: thread时的shared_ptr参考计数

  10. 10

    C ++ 11 std :: shared_ptr工作正常,但是boost :: shared_ptr崩溃了,这是什么原因引起的?

  11. 11

    QVariant与std :: shared_ptr

  12. 12

    QVariant与std :: shared_ptr

  13. 13

    std :: static_pointer_cast与static_cast <std :: shared_ptr <A >>

  14. 14

    使用std :: move与std :: shared_ptr

  15. 15

    使用std :: shared_ptr作为Objective-C中的全局变量

  16. 16

    C ++ std :: shared_ptr,是否operator =重载以使用复制构造函数?

  17. 17

    使用std :: shared_ptr作为Objective-C中的全局变量

  18. 18

    C ++ std :: shared_ptr会初始化类中的其他成员数据

  19. 19

    传递 std::shared_ptr 作为对 lambda 捕获列表的引用(C++)

  20. 20

    如何在包装头文件中包装 c++ std::shared_ptr 以便它可以从 c 中调用?

  21. 21

    std :: move(const shared_ptr参考)是什么意思?

  22. 22

    拥有std :: make_shared的std :: shared_ptr

  23. 23

    std :: shared_ptr和继承

  24. 24

    std :: shared_ptr深层复制对象

  25. 25

    std :: function和shared_ptr

  26. 26

    使用* this作为std :: shared_ptr

  27. 27

    数据与memcpy的std :: shared_ptr分配

  28. 28

    std :: shared_ptr预分配内存

  29. 29

    std set of boost :: shared_ptr <string>

热门标签

归档