[分享] C++ shared pointer 的速度

楼主: johnjohnlin (嗯?)   2020-10-28 20:59:37
由于工作性质的关系
我的程式会需要就是在不同函数间传递资料
但是这个资料是模拟封包传递,一个 struct 可能有 100~1000 KB
像是 Producer 会一直产生固定大小的 struct
然后让 Consumer 去消化
作者: Lipraxde (Lipraxde)   2020-10-28 21:15:00
这个...应该是 object pool 吧...?
作者: firejox (Tangent)   2020-10-28 21:20:00
封包实际在传也不会传指标阿
作者: loveme00835 (发箍)   2020-10-28 21:21:00
你知道 shared_ptr 是在 share 什么东西吗? 很明显就是理解错才会这样写
作者: nh60211as   2020-10-28 21:23:00
我都不new,改用placement new,写起来跟C有九成像
作者: loveme00835 (发箍)   2020-10-28 21:33:00
shared_ptr 是在 share ownership, 使用 shared_ptr即是把这个概念给写进程式码里, 依照你的描述, 物件的 owner 应该是 pool 而不是 my_shared_ptr, 你程式码这样写就是设计错误. 用 raw pointer 就能 share data 才不需要什么 smart pointer. 只要有人跟你说 shared_ptr 是用来 share data 那就是在乱写
楼主: johnjohnlin (嗯?)   2020-10-28 22:11:00
等等,我想一下pool应该要own那些没被my_shared_ptr own的object但是如果用raw pointer,我要怎么知道shared_ptr不会再使用这个资料了?如果没有额外包一层的话,我就必须每次都allocate新的资料,这是我想避免的事情
作者: loveme00835 (发箍)   2020-10-28 22:24:00
这就是你在设计的时候应该要考虑的问题, 而不是便宜行事用 shared_ptr 然后才觉得慢想去改进它不清楚实际使用情境, 所以我没办法帮你解答这个问题
楼主: johnjohnlin (嗯?)   2020-10-28 22:27:00
对啊,所以我才在这边看看有没有人遇过类似的情境的不然以我目前想到的方法,shared就是个堪用的解法
作者: loveme00835 (发箍)   2020-10-28 22:32:00
https://youtu.be/JfmTagWcqoE可以先看完这个影片再思考如何设计比较恰当就像我前面打的, 你实际使用上是怎么样? my_shared_ptr 会被什么类别 own? 这些类别的关系是怎样? my_shared_ptr 会在多少个执行绪里使用? 没写清楚要怎么给你建议?
作者: enthos (影斯作业系统)   2020-10-28 22:53:00
作者: ucrxzero (RX-0)   2020-10-28 22:59:00
推推推问一下楼上你觉得先上课了解RPC原理还是直接看thrift gRPC那些手册动手做比较有用呢我现在是前者 我抱持的心态就是反正我只要在意抠你的哪个函式名称要对上名字而已,这样还要花钱吗更正 我是后者这样对我未来职涯走大型主从式架构设计有帮助吗?因为....thrift的手册非常难啃...
作者: Killercat (杀人猫™)   2020-10-29 14:39:00
其实这满奇怪的,因为据我所知目前的shared_ptr他有用replacement new/delete用类似memory pool的方式操作除非我记错了... 晚点看看C++17 STL实作先因为这个要做pool太简单了 大小是固定的....
作者: sarafciel (Cattuz)   2020-10-29 21:22:00
你文章在解的问题其实跟smart pointer没什么关系啦XD而且二楼的f大提到重点 你要做的是模拟封包传递的话丢指标其实是一个完全失真的做法
作者: F04E (Fujitsu)   2020-10-30 15:06:00
拜托去弄一本Effective Modern C++来看
作者: ucrxzero (RX-0)   2020-10-30 15:08:00
我读过啦 还不是被呛爆
作者: F04E (Fujitsu)   2020-10-30 16:06:00
干 读过跟读懂是两回事
作者: ucrxzero (RX-0)   2020-10-30 18:48:00
抱歉
楼主: johnjohnlin (嗯?)   2020-10-31 11:53:00
我也读过啊 XD请问传pointer会造成失真的理由是什么呢,是执行速度吗
作者: LPH66 (-6.2598534e+18f)   2020-10-31 12:57:00
打个比方: 你想模拟寄包裹, 但这模拟却只寄了挂号号码过去
作者: sarafciel (Cattuz)   2020-10-31 15:40:00
对 你在做的事相当于 告诉对方你的东西放你家的哪里然后期待对方在他家里的同一个地方找到一模一样的东西你现在可以work只是因为 这两人其实是住在同一间屋子用CS的话来讲 就是thread间的memory space有一致性而这个一致性其实是一个很强的条件 不用到两台机器光同一台机器两个不同process就不会有这个条件了另外 十万台法拉利跟十万颗螺丝的运送成本很明显不同但是因为你这边都改用小纸条(指标)在传递了这两个case的传输成本就会从差很大变成相当接近
作者: CoNsTaR ((const *))   2020-11-01 04:43:00
建议可以读个 Linear logic (Linear types)?把你要做的事情都探讨完了

Links booklink

Contact Us: admin [ a t ] ucptt.com