FWIW、次のコード
のgcc -O2でコンパイルさ
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);
}
は、このアセンブリを生成します:あなたが見ることができるよう
.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:
はf1
またはf2
のいずれかの多くの左は、ありません。
C++標準に関する限り、コンパイラは、観察可能な振る舞い(のようにの規則)を変更しない限り、最適化に関して何かを行うことができます。
コンパイラを指定せずに(コンパイル時の既知の引数の場合)、コンパイラが何を行うのか分かりませんが、両方を最適化する可能性があります。コンパイル時に既知の引数をそれぞれコンパイルし、出力を検査する方法の1つです。 –
生成されたアセンブリコードを見てください – James
FWIW、MSVCは、ブール値そのものの評価でトリックをしないようにした場合、マスクを生成して最初のケースに追加し、2番目にケースを追加しますさらに最適化するためにboolを生成するテストが変更されます)。本質的に、MSVCはいずれの場合もブランチレスであり、素朴なケースではより最適なようです。 – JasonD