尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

C++constexpr编译期计算

C++constexpr编译期计算
📅 发布时间:2026/7/5 19:03:13

C++constexpr编译期计算

constexpr是C++中在编译期执行计算的关键字。通过constexpr函数和变量,可以将运行时计算转移到编译期,提高程序性能。

constexpr变量必须在编译期初始化。

#include
#include

constexpr 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是C++17的编译期条件分支。

template
constexpr 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数组生成。

template
constexpr 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_squares<10>();

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";
}

C++20的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是提高代码性能的重要工具,通过编译期计算减少运行时开销。

相关新闻

  • 构建个人开发效率工作台:从启动器到自动化脚本的实践指南
  • Steamauto终极指南:如何实现游戏饰品全自动交易管理
  • 2026年北京成立十年以上的家具维修维修培训学校客户口碑力荐 - myqiye

最新新闻

  • 全面掌握ExplorerPatcher:打造个性化Windows工作环境的实用指南
  • Mermaid Live Editor:让图表创作变得像写笔记一样简单
  • Runno Web组件实战:创建交互式代码示例的10个技巧
  • 如何高效部署Kronos金融预测模型:3种终极配置方案详解
  • 让老款Mac重获新生:OpenCore Legacy Patcher完整指南
  • 3分钟免费安装!让通达信自动识别缠论中枢和买卖点的终极指南

日新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号