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/cn.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灯, 水草

请输入看板名称,例如:BuyTogether站内搜寻

TOP