C++ 三目操作符与ifelse效率的区别

测试环境Linux version 2.6.18-194.el5
gcc 版本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.cpp

int 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效率在此种情况下高于三目运算符。

欢迎来喷


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值