編譯器對於簡單分支的處理,感受很是高效。ide
好比這段C代碼ui
void sign3_c (uint8_t* s0, uint8_t *s1, int8_t *d, int width, int height, int stride) { int i,j; for(j = 0; j < height; j++) { int offset = j*stride; for(i = 0; i < width; i ++) { uint8_t c0 = s0[offset + i], c1 = s1[offset + i]; int8_t v = 0; if (c0 < c1) v = -1; if (c0 > c1) v = 1; d[offset + i] = v; } } }
其內層循環體編譯出來的代碼爲spa
.L6: movzbl 0(%ebp,%eax), %ecx movzbl (%edi,%eax), %edx cmpb %dl, %cl sbbl %ebx, %ebx cmpb %dl, %cl movl $1, %edx cmova %edx, %ebx movb %bl, (%esi,%eax) addl $1, %eax cmpl 44(%esp), %eax jne .L6
雖然咱們在C語言的層面上有兩個判斷,可是編譯到x86上竟然使用條件移動等質量將分支去掉了,不得不讚一個code