4 ms·
The ternary operator a?b:c is still a conditional operation and may result in a branch instruction, same as an if statement. I wouldn't think it would matter mu
by jsd1982 8y ago
The ternary operator a?b:c is still a conditional operation and may result in a branch instruction, same as an if statement. I wouldn't think it would matter much how exactly the branch condition was spelled in C code. It'll get translated to low level IR and optimized at that level.
- kccqzy 8y agoIn this case, the GP is having code of the form a ? 0 : 1 which can usually be rewritten as !a Any worthwhile compiler should compile that into one instruction or two, like `setne` or something else.
- lostmsu 8y agoI was hoping for a direct translation to CMOV. Anyway, the assembly has to be analyzed to be sure.
- Karliss 8y agoNo need to speculate. https://godbolt.org/z/AC2NKY https://godbolt.org/z/AC2NKY . Results significantly vary between compilers. In almost all cases there is at least one jump generated due to the way comparison with 3 values less than 32 is done. If the number is less than or equal to 32 compiler does a lookup in bitmask indicating which values to skip. Often Clang and MSVC generated a second jump.
- lostmsu 8y agoNone of the compilers generated branch-free loop. Looks like or short-circuiting is the reason. Now I wonder if getting rid of branches at assembly level actually gives any benefit. That can be achieved by using | instead of ||.
- kccqzy 8y agoIf I were writing it, I would probably compare the `src[i]` against the three values, setne for each, `and` them together, and add that to the destination pointer.
- caf 8y agoYou could also do the inversion yourself: dst += (src[i] != ' ' && src[i] != '\r' && src[i] != '\n'); (This also misses some other whitespace, like '\t', '\f' and '\v', which if you included might change the balance between the vector and scalar versions).