许多实例与许多std :: shared_ptr相比

时间:2015-09-01 12:06:56

标签: c++ performance qt std

如果我使用类的许多实例或使用def funcd(x): dwdt_evaluator=lambdify(tf,W.diff(tf)) return dwdt_evaluator(x) ,我只想知道在使用C ++复制对象时是否会产生性能差异。

背景:我有一些通过信号和插槽机制(Qt)传递的结构。 (我知道在发送信号时会复制实例)这些传输可能会多次发生,因此必须快速,内存使用率低。

编辑(添加一些细节):
我编写了一个嵌入式应用程序(是的,Qt不是我知道的嵌入式后端最快的),它可以拥有动态数量的“模块”。每个模块都有自己的功能。每个模块都有一个信号和一个插槽。哪个模块接收发射的信号是可以自由配置的。因此可能会在很短的时间内发出许多信号。在这种情况下,信号必须尽可能快地传送。
交付的结构具有一些模块特定的数据和必须传递给其他模块的数据。我不能说交付的数据有多大,因为将来会有更多的模块可能提供更多的数据。

顺便说一句:我在这种情况下滥用std::shared_ptr。我没有用我真正分享所有权。 Qt只是在信号和插槽中以相同的方式处理引用和实例,它复制对象。因此,为了获得两者的好处,实例的简单内存管理和较低的内存使用参考,我想到了使用std::shared_ptr

1 个答案:

答案 0 :(得分:0)

  

Qt只是在信号和插槽中以相同的方式处理引用和实例,它会复制对象。

不,它只在特定情况下复制。有关详细信息,请参阅this answer。 TL; DR:只有在需要通过排队连接传递呼叫时才会复制,然后只有在接收器连接到给定信号时才会复制。使用直接连接(或同一线程内的默认自动连接),如果信号和插槽都通过引用传递参数,则不会复制。

  

在这种情况下,我滥用了std :: shared_ptr。

这不是滥用。您将通过shared_ptr持有的共享数据结构传递了多少。这很有道理。

真正的问题是:如果您的结构复制费用昂贵,为什么不通过QSharedDataQExplicitlySharedDataPointer使用显式共享?为什么您的问题不包括测量结果以证实您的担忧?来吧,这样的事情是trivial to measure。你有Qt帮助你 - 使用它。