C++程序设计语言练习5.8 编译器对指针的优化

代码如下:

#include <iostream>
using std::cout;

int _tmain(int argc, _TCHAR* argv[])
{
	const int SIZE = 1000;
	int ia[SIZE];
	for (size_t i = 0; i < SIZE; i++) {
		ia[i] = i;
	}
	int ib[SIZE];
	int *ip = ib;
	for (size_t i = 0; i < SIZE; i++) {
		*ip++ = i;
	}
	for (size_t i = 0; i < SIZE; i++)
	{
		cout << ia[i] << " " << ib[i] << "\n";
	}

	return 0;
}

vs2013编译后的汇编代码:

.text:00415E0F                 mov     eax, [ebp+iter]
.text:00415E15                 add     eax, 1
.text:00415E18                 mov     [ebp+iter], eax   // 给i加1
.text:00415E1E
.text:00415E1E loc_415E1E:                             ; CODE XREF: _wmain+3Dj
.text:00415E1E                 cmp     [ebp+iter], 1000
.text:00415E28                 jnb     short loc_415E3F
.text:00415E2A                 mov     eax, [ebp+iter]   // 取下标
.text:00415E30                 mov     ecx, [ebp+iter]   // 取值
.text:00415E36                 mov     [ebp+eax*4+ia], ecx    // 将值赋给数组下标
.text:00415E3D                 jmp     short loc_415E0F
.text:00415E3F ; ---------------------------------------------------------------------------
.text:00415E3F
.text:00415E3F loc_415E3F:                             ; CODE XREF: _wmain+58j
.text:00415E3F                 lea     eax, [ebp+_Val]
.text:00415E45                 mov     [ebp+ib], eax
.text:00415E4B                 mov     [ebp+iter1], 0
.text:00415E55                 jmp     short loc_415E66
.text:00415E57 ; ---------------------------------------------------------------------------
.text:00415E57
.text:00415E57 loc_415E57:                             ; CODE XREF: _wmain+BFj
.text:00415E57                 mov     eax, [ebp+iter1]
.text:00415E5D                 add     eax, 1
.text:00415E60                 mov     [ebp+iter1], eax   // 给i加1
.text:00415E66
.text:00415E66 loc_415E66:                             ; CODE XREF: _wmain+85j
.text:00415E66                 cmp     [ebp+iter1], 1000
.text:00415E70                 jnb     short loc_415E91
.text:00415E72                 mov     eax, [ebp+ib]        // 获取地址
.text:00415E78                 mov     ecx, [ebp+iter1]     // 获取值
.text:00415E7E                 mov     [eax], ecx           // 将值赋值给合适指针地址
.text:00415E80                 mov     edx, [ebp+ib]
.text:00415E86                 add     edx, 4
.text:00415E89                 mov     [ebp+ib], edx        // 更新地址 + 4
.text:00415E8F                 jmp     short loc_415E57


从上面的汇编代码可以看出:

数组下标法使用了复杂指令,而指针法使用简单指令,具体执行时间看CPU对指令的执行时长,在执行较小的任务时,所产生的效率优势并不明显。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值