当前位置: 首页 > news >正文

C++constexpr编译期计算

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

http://www.rkmt.cn/news/1545894.html

相关文章:

  • 构建个人开发效率工作台:从启动器到自动化脚本的实践指南
  • Steamauto终极指南:如何实现游戏饰品全自动交易管理
  • 2026年北京成立十年以上的家具维修维修培训学校客户口碑力荐 - myqiye
  • Platinum-MD:终极跨平台MiniDisc音乐管理完整指南
  • 绿电:当环境价值开始变现 - 蓝色星球
  • 如何在Windows上免费实现实时语音转文字:TMSpeech离线字幕工具完整教程
  • Playwright自动化测试:文件上传与弹窗处理的完整解决方案
  • 机器学习12个常见错误:从数据泄露到工程部署的实战避坑指南
  • 日语视频没字幕怎么办?让N46Whisper为你自动生成专业级字幕
  • 前端接口,Service 接口——很多新手都搞混了这两个“接口“
  • IIS10 HTTPS握手失败深度排查:从证书权限到TLS协议的系统性解决方案
  • Win7蓝牙耳机驱动问题终极解决方案:从硬件识别到稳定连接
  • OpenCore Legacy Patcher深度解析:3大技术突破让老Mac重获新生
  • 《Vue3 从入门到大神06篇》ref 还是 reactive?一文搞懂响应式数据的选择
  • MLOps六大基础原则:模型上线不翻车的实操守则
  • ASPICE实践指南 —— 过程能力模型(Process capability model)的落地解析
  • Spring Boot 4.0 对 AOT(提前编译)和 GraalVM 原生镜像的支持有哪些强制性变化或核心增强?如何针对原生镜像环境进行代码适配?
  • 2026年 钙钛矿太阳能路灯企业排行榜
  • 2026 江苏南京市(全区域服务)彩钢瓦翻新 / 防水 / 补漏 / 除锈喷漆|金属钢结构厂房屋面修缮 TOP4 权威推荐 + 完整避坑指南 - 本地便民网
  • 华硕笔记本终极控制方案:G-Helper完全替代臃肿奥创中心
  • 2026年推荐五常大米/五常大米溯源高口碑品牌推荐 - 品牌宣传支持者
  • Grok 4:强化学习驱动的推理范式跃迁
  • 2026 江苏苏州全域|彩钢瓦翻新 / 防水补漏 / 钢结构雨中行屋面修缮 - 本地便民网
  • 基于 Raspberry Pi Pico 2 C/C++ SDK 的 SGP30 空气质量监测器
  • 2026年正规的永磁专用变频器/上海永磁变频器/变频器/上海永磁变频器控制器厂家选择推荐 - 行业平台推荐
  • 2026年口碑好的吊钩式抛丸机/悬链式吊钩式抛丸机优质厂家推荐榜 - 品牌宣传支持者
  • 从概念到实战:dB、dBm、dBc在无线通信中的精准应用
  • 3D高斯泼溅编辑终极指南:从零开始掌握SuperSplat完整工作流
  • 2026年专业的上海水泵压力控制器/泵军师水泵控制器/上海控制器推荐厂家精选 - 品牌宣传支持者
  • 从提示词工程到 Harness 设计范式