-
-
[分享]《探索现代化C++》泛读笔记摘要18
-
发表于: 2022-9-30 08:39 6504
-
《探索现代化C++》泛读笔记摘要18
Chapter 5 元编程
在C++的编译过程中进行计算。
让编译器进行计算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <iostream> using namespace std; constexpr long fibonacci( long n) { return n < = 2 ? 1 : fibonacci(n - 1 ) + fibonacci(n - 2 ); } constexpr double square(double x) { return x * x; } int main() { cout << fibonacci( 15 ) << endl; cout << square( 6 ) << endl; } |
通过IDA反汇编看,有的似乎也没有进行编译时计算。
C++20 consteval
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <iostream> using namespace std; consteval long fibonacci( long n) { return n < = 2 ? 1 : fibonacci(n - 1 ) + fibonacci(n - 2 ); } constexpr double square(double x) { return x * x; } int main() { cout << fibonacci( 15 ) << endl; cout << square( 6 ) << endl; } |
强制函数在编译时进行计算。这个确实生效了。
判定质数问题
第一版
1 2 3 4 5 6 7 8 9 10 | constexpr bool is_prime( int i) { if (i = = 1 ) return false; if (i % 2 = = 0 ) return i = = 2 ; for ( int j = 3 ;j<i;j + = 2 ) if (i % j = = 0 ) return false; } |
第二版 (这一版需要c++ stl的sqrt是constexpr修饰的。)
1 2 3 4 5 6 7 8 9 10 11 12 | constexpr bool is_prime( int i) { if (i = = 1 ) return false; if (i % 2 = = 0 ) return i = = 2 ; int max_check = static_cast< int >(sqrt(i)) + 1 ; for ( int j = 3 ; j < max_check; j + = 2 ) if (i % j = = 0 ) return false; return true; } |
第三版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | constexpr int const_abs( int i) { return i< 0 ? - i:i;} constexpr int square_root( int x) { double r = x, dx = x; while (const_abs((r * r) - dx)> 0.1 ){ r = (r + dx / r) / 2 ; } return static_cast< int >(r); } constexpr bool is_prime( int i) { if (i = = 1 ) return false; if (i % 2 = = 0 ) return i = = 2 ; int max_check = square_root(i) + 1 ; for ( int j = 3 ;j<max_check;j + = 2 ) if (i % j = = 0 ) return false; return true; } |
第四版
1 2 3 4 5 6 7 8 9 10 | constexpr bool is_prime_aux( int i, int div) { return div > = i ? true : (i % div = = 0 ? false : is_prime_aux(i, div + 2 )); } const bool is_prime( int i) { return i = = 1 ?false: (i % 2 = = 0 ?i = = 2 :is_prime_aux(i, 3 )); } |
赞赏
他的文章
- 定位Windows分页结构内存区域 6849
- [原创]2022年,工业级EDR绕过蓝图 27833
- [分享]《探索现代化C++》泛读笔记摘要20 完! 7297
- [分享]《探索现代化C++》泛读笔记摘要19 7551
- [原创]摘微过滤驱动回调的研究-续 10128
看原图
赞赏
雪币:
留言: