假设我有类似下面的代码,processData
每分钟执行数百次甚至数千次:
class DataProcessor {
private:
DataValidator* validator;
bool atLeastOneDataPoint;
bool dataIsValid(Data* dataToValidate) {
return validator->validate(dataToValidate);
}
public:
// ...
void processData(Data* dataToProcess) {
if (dataIsValid(dataToProcess) || !atLeastOneDataPoint) {
// process data
// ...
atLeastOneDataPoint = true;
}
}
// ...
}
从名称可以推断出,atLeastOneDataPoint
是一个实际上只需要设置一次的变量,但在上面的代码中,每次在第一个数据后调用processData
时都会设置它点。当然,我可以将分配线更改为:
if (!atLeastOneDataPoint) atLeastOneDataPoint = true;
但是,这只会用一堆不必要的布尔检查来代替一堆不必要的赋值。
我并不担心这段代码的性能;真的,我只是觉得做一些完全没必要的事情的想法。是否有一种标准的方式来设置这样的一次性开关,这在设计中更直观“适当”?
至于是否关心这一点让我成为一个糟糕的程序员:让我们再讨论这个讨论了。
答案 0 :(得分:4)
我会说你已经得到的是最好的方法:只需在每次迭代时设置布尔标志。
如果您不关心性能,我认为这是最易读的解决方案:它很好而且显而易见 - 我处理了一个有效的数据点,所以我将标志设置为true。
即使性能受到关注,我认为您很难找到比将单个布尔值设置为true更有效的任何操作。
答案 1 :(得分:1)
回调
首先注册一个名为“call_once_at_init()”的函数,此函数将注册“call_always_after_init()”以供以后使用。
答案 2 :(得分:0)
规定您不要将atLeastOneDataPoint用作流程数据中的第一个标志
void processData(Data* dataToProcess) {
if ( (atLeastOneDataPoint = (dataIsValid(dataToProcess) || !atLeastOneDataPoint) ) ) {
// process data
//...
}
}
但每分钟10000不算什么 - 担心每秒150万次
答案 3 :(得分:0)
这不是你想要的吗?
void processData(Data* dataToProcess) {
if (!atLeastOneDataPoint) atLeastOnedataPoint = true;
if (dataIsValid(dataToProcess)) {
// process data
// ...
}
}
这实际上只是atLeastOnedataPoint = true
一次。
即使每次都这样做,执行if (!atLeastOneDataPoint) atLeastOnedataPoint = true;
也应该少于100 ns(可能要少得多)。即使在100 ns时,如果你在一分钟内完成1000次,那么在那一分钟消耗100us = 0.1ms。
我打赌你有“更大的鱼来炒”。