其基本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