C_and_CPP 板


LINE

※ 引述《noodleT (麵T)》之銘言: class objB{ //變換矩陣 double transform[16]; //上一次的矩陣值 double preTranform[16]; //原始座標 double vertex[3n]; //新座標 double newVertex[3n]; // void multi(double *matrx) { 將變換矩陣乘上 matrx } double* GetNewVertex() { 如果變換矩陣值沒變 (等於preTransform), 回傳newVertex; 否則重算並回傳newVertex } } 像上面這種情況, preTransform 和 newVertex 也是只在一個func中使用, 而且原本成員就有類似的名稱 transform 和 vertex
1F:→ noodleT: 其他開發者,萬一在class中直接使用newvertex,而不是透 12/30 00:05
2F:→ noodleT: 過getnewvertex(),那他所計算的值就不保証是最新的座標 12/30 00:05
以這情況來說,你需要的是mutable 1.GetNewVertex()本身的概念是const的,所以應該加上const 2.return value應該是const double* 3.一旦有呼叫multi(double *matrx)這個function,GetNewVertex()就需要重算 考慮到double的比較問題(見十三誡),如果preTranform"只是"拿來判斷transform是否有改變,那我認為用個bool flag來表示是否需要重新計算會比較好 4.承上,flag的初始值要是false 5. void multi(double *matrx) { //do something flag=false; } 6. const double* GetNewVertex() const { if(!flag) calc_newVertex(); return newVertex; } 7.calc_newVertex()當然本身也是const,然而一個const function想要改變一個data member,就必須要將該data member變為mutable 因此你的double newVertex[3n]會變成mutable double newVertex[3n] 8. void calc_newVertex() const { //do something flag=true; } 9.承上,既然如此,flag也要變成mutable 到目前為止,這就滿足你的要求,然而,你有mutable,在C++11後會變得有點麻煩 由於calc_newVertex()本身是const,一個const member function本身應該是thread safe的 假設multi(double *matrx)已經被呼叫,之後有多個thread都呼叫calc_newVertex() 你的newVertex會有data race 因此你的newVertex本身需要用std::mutex保護,或是本身變為atomic(flag也是同理,雖然他是bool) 如果選用mutex,會需要額外兩個mutex,一個保護flag,一個保護newVertex (由於會在const member function使用,mutex也要是mutable) 因此我會選擇用atomic,把flag改成std::atomic<bool>,newVertex改成atomic<double> (延伸:flag為什麼不用std::atomic_flag而是atomic<bool>呢?) 那你只需要把GetNewVertex()的return value改成const atomic<double>* 到這邊為止,就大功告成 你可能還是有疑惑,這樣不就多個thread會呼叫calc_newVertex()嗎? 答案是對的,因為我不知道這個計算過程到底是大還是小,所以目前能給的建議就是這樣 如果你想要只有一個thread去呼叫calc_newVertex(),那你就需要增加mutable std::condition_variable與mutable mutex 再讓thread去cv那邊wait,直到flag變為false 但我覺得額外使用這些很麻煩,如果只是維持const的基本功能,以上提到的這些就夠 除非你真的那麼在意效能,或是calc_newVertex()的計算量真的很大 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.163.64.217
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1451448573.A.963.html
3F:推 noodleT: 感謝,除了原問題還提醒我執行緒的部分。但這樣還是無法 12/30 21:51
4F:→ noodleT: 阻止其他function 直接使用newVertex 12/30 21:51
5F:推 noodleT: 使用preTransform而不是flag,是為了:平移+100、平移-10 12/30 21:58
6F:→ noodleT: 0後再呼叫GetNewVertex這種情形。若用flag的判斷結果會認 12/30 21:58
7F:→ noodleT: 為需要重新計算 12/30 21:58
8F:→ Caesar08: newVertex應該是private才對,怎麼會直接使用呢? 12/30 23:01
9F:推 noodleT: 在實作 objB 的其他函式時 12/31 06:34
10F:→ noodleT: 應該說:其他共同開發者 12/31 06:37







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP