用 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);