考慮以下幾點:避免檢查可能發生,如果
class ReadWrite {
public:
int Read(size_t address);
void Write(size_t address, int val);
private:
std::map<size_t, int> db;
}
在讀功能訪問其以前沒有寫是爲了我想要麼拋出異常指定這樣的錯誤或允許並返回0地址的時候,在其他字我想要使用std::map<size_t, int>::operator[]()
或std::map<size_t, int>::at()
,取決於用戶可以設置的一些布爾值。所以,我添加以下內容:
class ReadWrite {
public:
int Read(size_t add) { if (allow) return db[add]; return db.at(add);}
void Write(size_t add, int val) { db[add] = val; }
void Allow() { allow = true; }
private:
bool allow = false;
std::map<size_t, int> db;
}
的問題,那就是: 通常情況下,該方案將允許有一個呼叫或沒有在節目的開頭,然後再把許多的訪問。因此,性能方面,這個代碼很糟糕,因爲它每次執行檢查if (allow)
,通常它總是爲真或者總是爲假。 那麼你會如何解決這個問題?
編輯:
雖然這個類的描述使用情況下(在第一次或無Allow()
)很可能它不是明確的,所以我必須允許用戶調用Allow()
動態。
另一個編輯:
的解決方案,使用函數指針:有關使用函數指針是不能夠由編譯器進行在線支付的性能開銷是什麼?如果我們使用std::function
而不是解決這個問題?
如果這確實是您的性能瓶頸? –
不,我沒有,但它仍然是不必要的檢查,它是困擾我 –
1)如果你想要的功能沒有必要。 2)你不知道編譯器和cpu會做什麼優化3)即使沒有必要,也沒有編譯器和cpu完成的優化,這個問題仍然是[過早優化](https:// xkcd (這是所有邪惡的根源,順便說一句)(http://stackoverflow.com/questions/385506/when-is-optimisation-premature)) – zvone