13.2.5 直接设置符号
既然_copysign()可以直接操作浮点数,我们也可以这么做:
- double myabs(double data)
- {
- DWORD* p = (DWORD*)&data;
- p[1] &= 0x7FFFFFFF;
- return data;
- }
对应的汇编代码如下:
- __declspec(naked) double myabs(double data )
- {
- __asm AND dword ptr [esp+8], 0x7FFFFFFF
- __asm fld qword ptr [esp+4]
- __asm ret
- }
这段代码的效率与使用_copysign()差不多,但由于没有使用任何浮点常数(例如1.0)提供符号,减少了参数传递和内存操作,因此效率要高一些。
至此,在使用函数框架的前提下,代码已经相当简化,很难再作进一步改进了。不过,如果将函数声明为内联函数,那么在某些情况下还会免去参数传递操作,效率会更高一些:
- inline double myabs( double data );
【责任编辑:
董书 TEL:(010)68476606】