如果给函数传入的参数是一个表达式编译器会怎么样处理

例如 DisplayMutiChar8x16(chBuff,2*8,1*16,8); 
这样的函数调用,有人认为编译后的代码会花时间计算表达式的值,但实际上表达式是以最终结果的形式传入函数的,可以看看汇编的代码。

DisplayMutiChar8x16(chBuff,4*8,1*16,8);
0x800147e: 0x2308 MOVS r3, #8
0x8001480: 0x2210 MOVS r2, #16 ; 0x10
0x8001482: 0x2120 MOVS r1, #32 ; 0x20
0x8001484: 0xa800 ADD r0, SP, #0x0
  0x8001486: 0xf7ff 0xfec5 BL DisplayMutiChar8x16 ; 0x8001214

可以看到三个参数以立即数的形式直接传入了函数,编译并没有生成计算表达式结果的代码。

想说明的问题的是,在赋值操作是类似于 2*3+5 这样的常量表达式并不会增加代码负担,但是却可以很好地增强程序的可读性。

需要注意的是,这里仅仅针对常量表达式会在编译时计算其值;而如果是变量表达式,则只能在程序运行时计算其值如下:

u8 chBuff[8] = {“Welcome!”};
u8 a = 2;
DisplayMutiChar8x16(chBuff,4*(6+a),1*16,8);
0x8001480: 0x2308 MOVS r3, #8
0x8001482: 0x2210 MOVS r2, #16 ; 0x10
0x8001484: 0x1d80 ADDS r0, r0, #6
0x8001486: 0xb2c0 UXTB r0, r0
0x8001488: 0x0081 LSLS r1, r0, #2
0x800148a: 0xb2c9 UXTB r1, r1
0x800148c: 0xa800 ADD r0, SP, #0x0
0x800148e: 0xf7ff 0xfec1 BL DisplayMutiChar8x16 ; 0x8001214

PS:使用平台STM32+EWARM6.0

 

分享到: 更多
版权申明:

本站保留所有原创文章的版权,本站地址:奔跑的博客[http://www.elecbench.com]

原创文章转载时请注明出处,并添加文章所在页面的链接:http://www.elecbench.com/%e5%a6%82%e6%9e%9c%e7%bb%99%e5%87%bd%e6%95%b0%e4%bc%a0%e5%85%a5%e7%9a%84%e5%8f%82%e6%95%b0%e6%98%af%e4%b8%80%e4%b8%aa%e8%a1%a8%e8%be%be%e5%bc%8f%e7%bc%96%e8%af%91%e5%99%a8%e4%bc%9a%e6%80%8e%e4%b9%88/

本站所有 2010年3月4日 以后发表、未标明为“转载”的文章均是本站原创。

发表评论


(设置自己的个性头像)

*

申请属于你的免费顶级域名