Re: [問題] 介於static和private的宣告?
※ 引述《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
→
12/30 00:05,
12/30 00:05
→
12/30 00:05,
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://www.ptt.cc/bbs/C_and_CPP/M.1451448573.A.963.html
推
12/30 21:51, , 1F
12/30 21:51, 1F
→
12/30 21:51, , 2F
12/30 21:51, 2F
推
12/30 21:58, , 3F
12/30 21:58, 3F
→
12/30 21:58, , 4F
12/30 21:58, 4F
→
12/30 21:58, , 5F
12/30 21:58, 5F
→
12/30 23:01, , 6F
12/30 23:01, 6F
推
12/31 06:34, , 7F
12/31 06:34, 7F
→
12/31 06:37, , 8F
12/31 06:37, 8F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):