Два if перед отправкой сообщения об инвентаризации


Проходя main.cpp, я не мог до конца понять назначение двойного барьера, закодированного как if-операторы:
я имею в виду...

if (pto->setInventoryKnown.count(inv))

и

if (pto->setInventoryKnown.insert(inv).second)

В чем идея дважды проверить, известен ли инвентарь целевому узлу?
Я знаю, что if (pto->setInventoryKnown.count(inv))только проверяет, известна ли запись для целевого однорангового узла, и if (pto->setInventoryKnown.insert(inv).second)вставляет элемент инвентаря после проверки его уникальности.
Я имею в виду, нельзя ли просто использовать только одну комбинацию операторов if?

Ответы (2)

Я также не вижу причин для второго ifутверждения. Я не говорю здесь от какой-либо власти, но мне это кажется (крошечной) ошибкой эффективности.

Второй ifоператор существует с момента первого коммита . Первый ifоператор был вставлен примерно через год, когда была добавлена ​​«просачивание» сообщений tx inv, по-видимому, чтобы проверить членство в наборе раньше, чтобы избежать запуска логики просачивания, когда в этом нет необходимости. Я предполагаю, что удаление второго ifбыло просто упущено из виду.

Я не уверен, что второй вариант бесполезен.

Второй if выполняет более подробную проверку (см. mruset.hL50 https://github.com/bitcoin/bitcoin/blob/3fce72eaa3ea75aa911e32c4d96313848338cede/src/mruset.h#L51 ), что, я думаю, уменьшает размер набора и т. д.

Я не утверждал (хотя, возможно, я был неясен), что вставка бесполезна, только то, что проверка результата вставки бесполезна, потому что (как заметил Алиакбар Ахмади) результат всегда будет true. Мой ответ нуждается в обновлении?
Ах. Верно. Бесполезно само if, но не выражение внутри if. Справедливо. :)