假設我有一個課程如下:
class Test {
public:
Test() : mt((std::random_device())()), dist1(0, 10), dist2(0, 100) {}
void func() {
if (dist1(mt) < 4) {
// do something
}
}
void func2() {
if (dist2(mt) > 25) {
// do something
}
}
private:
std::mt19937 mt;
std::uniform_int_distribution<int> dist1;
std::uniform_int_distribution<int> dist2;
};
如您所見,有兩個函式,它們都需要一個亂數來做某事。
在這種情況下,我可以將資料成員std::mt19937 mt設為靜態并在 cpp 檔案中對其進行初始化嗎?
class Test {
...
private:
static std::mt19937 mt;
...
};
// cpp file
std::mt19937 Test::mt((std::random_device())());
我剛試過,它似乎作業。但是不知道是不是有什么問題。
Test t1; t1.func(); t1.func2();
Test t2; t2.func(); t2.func2();
我可以說靜態或非靜態不會對這段代碼造成任何差異嗎?
uj5u.com熱心網友回復:
我可以說靜態或非靜態不會對這段代碼造成任何差異嗎?
如果您關心每個實體Test將觀察到的特定數字序列,是的。但是你用 播種這些std::random_device,所以我懷疑你不在乎。
如果您在多個執行緒上呼叫這些方法,則靜態版本存在資料競爭。我會用thread_local, not static, 分享std::mt19937s。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/435295.html
上一篇:使用最新的gcc生成庫并使用舊的gcc使用它-為什么盡管C 版本相同,但仍然存在問題?
下一篇:將lambda函式傳遞給模板方法
