当前位置: 首页 > 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.jsqmd.com/news/1034001/

相关文章:

  • KNN回归原理与实战:从极简邻居法到生产级应用
  • 量子误差缓解技术在连续变量系统中的应用与优化
  • 华为单板硬件机考核心考点深度解析:从电磁波到电路设计的实战指南
  • 自监督学习在遥感影像分析中的关键技术与实践
  • Steamauto终极指南:如何实现游戏饰品全自动交易管理
  • Ubuntu系统root权限开启与安全管理全解析
  • 构建个人开发效率工作台:从启动器到自动化脚本的实践指南
  • 2026年北京成立十年以上的家具维修维修培训学校客户口碑力荐 - myqiye
  • Platinum-MD:终极跨平台MiniDisc音乐管理完整指南
  • 2026深圳豪宅全屋定制盲测:那些身价千万的业主,究竟在为怎样的工艺买单?
  • Gemini多模态原理深度解析:VQ-VAE、MQA与结构化Prompt工程
  • Agents框架终极指南:构建模块化自主语言智能体的完整方案
  • GLM-5.1 SEAM模块深度解析:符号执行如何让大模型真正‘看懂代码’
  • 2026这6款神级降AI率工具全网首测,一键把AI检测率精准控到安全区!
  • 2026年江苏工业热水泵维修厂家/高温高压热水泵公司客户口碑力荐 - myqiye
  • 长尾关键词优化与SEO结合的有效策略与案例分析
  • 绿电:当环境价值开始变现 - 蓝色星球
  • Playwright自动化测试:文件上传与弹窗处理的完整解决方案
  • 从Nsight Systems报告出发:一份CUDA程序优化的实战检查清单
  • 日语视频没字幕怎么办?让N46Whisper为你自动生成专业级字幕
  • 机器学习12个常见错误:从数据泄露到工程部署的实战避坑指南
  • 如何在Windows上免费实现实时语音转文字:TMSpeech离线字幕工具完整教程
  • 深度学习股票技术分析:CNN如何实现智能市场预测
  • 在Android设备上构建专业级Linux开发环境:proot-distro深度指南
  • 无啁啾高斯型超短脉冲激光
  • 3个关键步骤让老旧Mac设备重获新生:OpenCore Legacy Patcher实战指南
  • HYDRUS全模块进阶应用:土壤–水–污染物耦合模拟
  • 让AI收集GDC里和PCG相关的文章
  • CUSUM控制图在工业过程监控中的实战应用与参数调优
  • LeetCode 121 买卖股票的最佳时机——一文搞懂贪心算法思想