Re: [問題] 九九乘法表不用迴圈是叫我直接從1列到81?

作者: cole945 (躂躂..)   2018-07-22 19:15:53
用 template specialization 做 recursion 直接全展開,
連 runtime branch 都不會用到
乘法計算也是 compile time 用 template recursion, 不會有重覆計算的問題
若要用 runtime cache, 可以搭 local static variable 來做 cache
因為是 compiler 計算, 所以不論計算方法, 沒有 performance 的問題,
不過這裡還是用 binary shift-add 來計算, 只需要做乘數的 ones-bit 次數的shift-add
再利用 pop-count 取 ones 較少的值當乘數可減少 shift-add 的次數, 例如
8 * 7 = (8) + (8 << 1) + (8 << 2)
7 * 8 = (7 << 3)
整個99乘法表只要做 26 次 ADD (吧?)
有開 optimization, 應該編完是直接展開成 printf call
leaq .LC1(%rip), %rsi
movl $24, %r8d
movl $6, %ecx
movl $4, %edx
movl $1, %edi
xorl %eax, %eax
call [email protected] // printf ("%d x %d = %2d; ", 4, 6, 24);
leaq .LC1(%rip), %rsi
movl $28, %r8d
movl $7, %ecx
movl $4, %edx
movl $1, %edi
xorl %eax, %eax
call [email protected] // printf ("%d x %d = %2d; ", 4, 7, 28);
作者: Killercat (殺人貓™)   2018-07-22 21:47:00
連int2type都出來了..... XDmodern c++ design也好幾年沒翻了(遠目
作者: nowar100 (拋磚引玉)   2018-07-22 22:30:00
推 cole945下面給 LPH 接力
作者: cole945 (躂躂..)   2018-07-23 00:16:00
原本想把結果cache在class member才寫的這麼惡搞..用class template就不會寫這麼繞了XD cache拿掉忘了改

Links booklink

Contact Us: admin [ a t ] ucptt.com