contributed by < eric88525
>
解釋上述程式碼運作的原理
EXP1 =a & b & 1
EXP2 =a & b
EXP3 =a ^ b
&1
,唯有當 a 和 b 最低位元都是 1 時才需要+1,因此 exp1 = a & b & 1最終程式如下
比較上述實作在編譯器最佳化開啟的狀況,對應的組合語言輸出,並嘗試解讀
eax
is the return value registeredi
is the first function argumentesi
is the second function argument第一種版本,編譯器選項
-O1
第二種版本,編譯器選項
-O1
第二種方式指令數量變少,幾乎是都縮減一半
指令執行次數 | mov | shr | add | and | xor |
---|---|---|---|---|---|
方法1 | 2 | 2 | 2 | 2 | 0 |
方法2 | 1 | 1 | 1 | 1 | 1 |
解釋上述程式碼運作的原理
EXP4 =a^b
EXP5 =a<b
如要取 max 要讓
a^b
,並交由 -(EXP5)
來決定該為0或是a^b
-(EXP5) 應該要是全1或全0,才能決定 exp4 為0或維持原樣
0xFFFFFFFF
,在 a<b 情況需要a<b
針對 32 位元無號/有號整數,撰寫同樣 branchless 的實作
((x - y) & -(x < y))
來讓 x-y 是否維維持或設為 0,因為 -(x>y)
有二種結果
解釋上述程式運作原理
COND =v
RET =u << shift
輾轉相除法原理,概念如下
a
和b
的最大工因數, 如果a
比b
大,a
可寫成如下,q
是除數r
是餘數b
或r
其中一方為0就為解答解釋上述程式運作原理,並舉出這樣的程式碼用在哪些真實案例中;
EXP6 =bitset & -bitset
M = _h
X = 0
圖例: 以 ALIGNOF(int) 示範
為了驗證,用 gdb 來觀察記憶體位置
gdb 執行結果如下
可以得知alignment為 0x4 - 0x0 = 0x4
KK1 = div3
KK2 = div5
KK3 = div3<<2
div3
div5
來透過 shift 增加 strncpy 的複製長度 length
%u
div3 | div5 | length |
---|---|---|
0 | 0 | 2 |
0 | 1 | 4 |
1 | 0 | 4 |
1 | 1 | 8 |