FWIW, der folgende Code
inline unsigned int f1(const unsigned int i, const bool b) {return b ? i : 0;}
inline unsigned int f2(const unsigned int i, const bool b) {return b*i;}
int main()
{
volatile unsigned int i = f1(42, true);
volatile unsigned int j = f2(42, true);
}
mit gcc -O2 zusammengestellt produziert diese Versammlung:
.file "test.cpp"
.def ___main; .scl 2; .type 32; .endef
.section .text.startup,"x"
.p2align 2,,3
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
LFB2:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $16, %esp
call ___main
movl $42, 8(%esp) // i
movl $42, 12(%esp) // j
xorl %eax, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
LFE2:
gibt es nicht mehr viel übrig von entweder f1
oder f2
, wie Sie sehen können.
Soweit der C++ - Standard betroffen ist, darf der Compiler alles in Bezug auf die Optimierung tun, solange es das beobachtbare Verhalten nicht ändert (die als ob Regel).
Sie können nicht wissen, was "der Compiler" mit dem Ausdruck tun wird (im Fall von bekannten Kompilierzeitargumenten), ohne zu spezifizieren, welcher Compiler, aber es wird wahrscheinlich beide weg optimieren. Eine Möglichkeit zu sagen, kompilieren jedes mit Kompilierzeit bekannten Argumente und überprüfen Sie die Ausgabe. –
Schauen Sie sich den generierten Assembly Code an – James
FWIW, MSVC erzeugt eine Maske und addiert für den ersten Fall, und eine Multiplikation für die Sekunde, in einem Fall, in dem ich das Abspielen von Tricks mit der Auswertung des Booleans selbst verhinderte (wenn es kann ändert den Test, der den Bool erzeugt, um weiter zu optimieren). Im Wesentlichen ist MSVC in beiden Fällen zweiglos und scheint im naiven Fall optimaler zu sein. – JasonD