Usando bools en cálculos para evitar ramas.

Aquí hay una pequeña curiosidad de micro-optimización que se me ocurrió:

struct Timer {
    bool running{false};
    int ticks{0};

    void step_versionOne(int mStepSize) {
        if(running) ticks += mStepSize;
    }

    void step_versionTwo(int mStepSize) {
        ticks += mStepSize * static_cast<int>(running);
    }
};

Parece que los dos métodos prácticamente hacen lo mismo. ¿La segunda versión evita una rama (y, en consecuencia, es más rápida que la primera versión), o cualquier compilador es capaz de hacer este tipo de optimización con-O3?

Respuestas a la pregunta(2)

Su respuesta a la pregunta