其基本C语言的实现为:函数
1 static inline int clip3(int min, int max, int v) { 2 int ret = v; 3 if (ret < min) 4 ret = min; 5 if(ret > max) 6 ret = max; 7 return ret; 8 }
这个代码已经没法简化了,并且编译器通常来讲也能生成比较优化的代码。针对x86,能够使用内联汇编来指定生成的代码,好比使用gcc的内联:优化
1 static inline int clip3(int min, int max, int value) { 2 int ret = value; 3 __asm__ volatile( 4 "cmp %1, %0\n\t" 5 "cmovl %1, %0\n\t" 6 "cmp %2, %0\n\t" 7 "cmovg %2, %0\n\t" 8 :"+&r"(ret) 9 :"r"(min), "r"(max)); 10 return ret; 11 }
这个代码使用4条指令完成全部操做,而且没有分支。这种方式的缺点是,不一样编译器的内联形式不同。在VS2010中,相应的内联函数为spa
static inline int clip3(int min, int max, int value) { _asm { mov eax, value; cmp eax, min; cmovl eax, min; cmp eax, max; cmovg eax, max; } }
这些内联代码都是没有分支的。code