Yes the link shows how it doesn't matter today! Because almost all compilers are now 'optimising compilers'!
> There is no `cmp` opcode used. A simple unconditional `jmp` is used.
Oh my god that's the entire point! That's how compilers work now. They always optimise. They didn't used to do that.
The compiler checks the truthiness of the value in the while condition. Modern compilers remove it with either a tautology check, or a shortcut during IR building. They didn't used to do that, so there used to be a cost, which is why people started cargo-culting the for equivalent.
Here's a worked example using a niche compiler with a very different architecture that unusually still doesn't canonicalise during building.
> Your link even shows this.
Yes the link shows how it doesn't matter today! Because almost all compilers are now 'optimising compilers'!
> There is no `cmp` opcode used. A simple unconditional `jmp` is used.
Oh my god that's the entire point! That's how compilers work now. They always optimise. They didn't used to do that.
The compiler checks the truthiness of the value in the while condition. Modern compilers remove it with either a tautology check, or a shortcut during IR building. They didn't used to do that, so there used to be a cost, which is why people started cargo-culting the for equivalent.
Here's a worked example using a niche compiler with a very different architecture that unusually still doesn't canonicalise during building.
Compare
https://godbolt.org/z/3v3anacM8
and
https://godbolt.org/z/chWjsen4s
See the difference? See the 'cmp eax, 1' and then how it goes away under optimisation?