[分享] 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