考虑以下几点:避免检查可能发生,如果
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