C++constexpr编译期计算 📅 2026/6/18 5:13:04 Cconstexpr编译期计算constexpr是C中在编译期执行计算的关键字。通过constexpr函数和变量可以将运行时计算转移到编译期提高程序性能。constexpr变量必须在编译期初始化。#include#includeconstexpr int square(int x) {return x * x;}constexpr int factorial(int n) {return n 1 ? 1 : n * factorial(n - 1);}void constexpr_variables() {constexpr int a 10;constexpr int b square(5);constexpr int c factorial(5);std::cout a: a \n;std::cout square(5): b \n;std::cout 5! c \n;constexpr size_t arr_size square(10);std::array arr;std::cout Array size: arr.size() \n;}constexpr函数可以在编译期或运行时执行。constexpr int fibonacci(int n) {if (n 1) return n;int a 0, b 1;for (int i 2; i n; i) {int temp a b;a b;b temp;}return b;}void constexpr_function_demo() {constexpr int compile_result fibonacci(20);std::cout Compile-time Fib(20): compile_result \n;int runtime_n 10;int runtime_result fibonacci(runtime_n);std::cout Runtime Fib(10): runtime_result \n;}constexpr构造函数允许编译期创建对象。class Point {int x_, y_;public:constexpr Point(int x, int y) : x_(x), y_(y) {}constexpr int x() const { return x_; }constexpr int y() const { return y_; }constexpr double distance_squared() const {return x_ * x_ y_ * y_;}constexpr Point mid_point(const Point other) const {return Point((x_ other.x_) / 2, (y_ other.y_) / 2);}};void constexpr_objects() {constexpr Point p1(3, 4);constexpr Point p2(0, 0);constexpr double dist p1.distance_squared();std::cout Point: ( p1.x() , p1.y() )\n;std::cout Distance squared: dist \n;constexpr auto mid p1.mid_point(p2);std::cout Mid point: ( mid.x() , mid.y() )\n;}constexpr if是C17的编译期条件分支。templateconstexpr auto process(T value) {if constexpr (std::is_integral_v) {return value * 2;} else if constexpr (std::is_floating_point_v) {return value * 1.5;} else {return value;}}void constexpr_if_demo() {constexpr auto int_result process(10);constexpr auto double_result process(3.14);auto str_result process(std::string(test));std::cout Int: int_result \n;std::cout Double: double_result \n;std::cout String: str_result \n;}constexpr字符串处理。constexpr size_t string_length(const char* str) {size_t len 0;while (str[len] ! \0) len;return len;}constexpr bool string_equal(const char* a, const char* b) {while (*a *b *a *b) {a;b;}return *a *b;}void constexpr_strings() {constexpr size_t len string_length(Hello constexpr);constexpr bool eq string_equal(test, test);std::cout Length: len \n;std::cout Equal: eq \n;}constexpr数组生成。templateconstexpr std::array generate_squares() {std::array arr{};for (size_t i 0; i N; i) {arr[i] i * i;}return arr;}void constexpr_array_demo() {constexpr auto squares generate_squares10();std::cout Squares: ;for (int val : squares) {std::cout val ;}std::cout \n;}constexpr数学计算。constexpr double abs(double x) { return x 0 ? -x : x; }constexpr double sqrt_impl(double x, double guess) {return abs(guess * guess - x) 0.000001 ? guess: sqrt_impl(x, (guess x / guess) / 2.0);}constexpr double sqrt(double x) {return x 0 ? 0 : sqrt_impl(x, x / 2.0);}void constexpr_math() {constexpr double sq2 sqrt(2.0);constexpr double sq10 sqrt(10.0);std::cout sqrt(2): sq2 \n;std::cout sqrt(10): sq10 \n;}C20的consteval强制编译期执行。consteval int compile_only(int x) {return x * x * x;}void consteval_demo() {constexpr int result compile_only(5);std::cout Cube: result \n;}constexpr是提高代码性能的重要工具通过编译期计算减少运行时开销。