测试环境Linux version 2.6.18-194.el5gcc 版本4.6.3测试代码分两部分
main1.cpp
int main(int argc, char** argv) { int d = 10; int e = 0; if(d > 8) e = 10; else e = 5; return 0; }
main2.cppint main(int argc, char** argv) { int d = 10; int e = 0; e = d > 8 ? 10 : 5; return 0; }
无任何优化选项makefile:
all : main1 main2
main1 : main1.cpp
g++ -S main1.cpp -o main1.s
main2 : main2.cpp
g++ -S main2.cpp -o main2.s
编译出的汇编代码是
main1.s
.file "main1.cpp" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 subl $16, %esp movl $10, -4(%ebp) movl $0, -8(%ebp) cmpl $8, -4(%ebp) jle .L2 movl $10, -8(%ebp) jmp .L3 .L2: movl $5, -8(%ebp) .L3: movl $0, %eax leave .cfi_restore 5 .cfi_def_cfa 4, 4 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (GNU) 4.6.3" .section .note.GNU-stack,"",@progbits
main2.s.file "main2.cpp" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 subl $16, %esp movl $10, -4(%ebp) movl $0, -8(%ebp) cmpl $8, -4(%ebp) jle .L2 movl $10, %eax jmp .L3 .L2: movl $5, %eax .L3: movl %eax, -8(%ebp) movl $0, %eax leave .cfi_restore 5 .cfi_def_cfa 4, 4 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (GNU) 4.6.3" .section .note.GNU-stack,"",@progbits
区别在于main2.s中做完判断后先将值赋予了寄存器,然后再从寄存器取值存入内存main1.s中直接向内存赋值,由此可见,ifelse效率在此种情况下高于三目运算符。
欢迎来喷
C++ 三目操作符与ifelse效率的区别
最新推荐文章于 2022-07-09 18:52:37 发布