Я думаю, вы неправильно интерпретировали комментарий в коде:
Мы делим на два, чтобы не переполнить iter_c * 2
.
Независимо от того, откуда поступают значениянаписать a/2
безопасно, но писать a*2
небезопасно.Какой бы тип без знака вы ни использовали, вы всегда можете разделить число на два, а умножение может привести к переполнению.
Если условие будет записано так:
if (slot_p->sa_seen_c > _dmalloc_iter_c * 2) {
, то примерно половина входных данных вызовет неправильное условие.При этом, если вы беспокоитесь о переполнении счетчиков, вы можете заключить их в класс:
class check {
unsigned a = 0;
unsigned b = 0;
bool odd = true;
void normalize() {
auto m = std::min(a,b);
a -= m;
b -= m;
}
public:
void incr_a(){
if (odd) ++a;
odd = !odd;
normalize();
}
void incr_b(){
++b;
normalize();
}
bool check() const { return a > b;}
}
Обратите внимание, что для того, чтобы полностью избежать переполнения, вы должны принять дополнительные меры, но если a
и b
увеличены примерно на ту же сумму, это может быть уже хорошо.