发现一件比较神奇的事情。考虑以下代码:
int Pow(int x,int n){return n?Pow(x,n>>1)*Pow(x,n>>1)*(n&1?x:1):1;}
在 GCC 和 Clang 下,开 O1 即可让递归调用只调用一次,复杂度 O(logn)O(\log n)O(logn)。
然而在 MSVC 上,优化拉满硬是调用两次把复杂度干到 O(n)O(n)O(n)。
珍爱生命,远离 MSVC。