C++中的constexpr关键字有什么用

来源:AI智能体作者:不吃香菜头衔:草根站长
导读:本期聚焦于小伙伴创作的《C++中的constexpr关键字有什么用》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++中的constexpr关键字有什么用》有用,将其分享出去将是对创作者最好的鼓励。

constexpr是C++11引入的关键字,用于声明编译期常量表达式,它的核心作用是让相关的计算在编译阶段完成,而不是等到程序运行时再执行,从而提升程序的运行效率,同时增强代码的类型安全性。

C++中的constexpr关键字有什么用

constexpr的基本用法

constexpr最常见的用法是声明编译期常量,和普通的const常量不同,constexpr修饰的变量必须在编译阶段就能确定其值,不能依赖运行时的变量或函数返回值。

#include <iostream>

// 编译期常量,值必须是编译时可确定的字面量
constexpr int compile_time_const = 100;
// 普通const常量,值可以是运行时确定的
const int run_time_const = rand();

int main() {
    // constexpr变量不能修改
    // compile_time_const = 200; // 这行会编译报错
    std::cout << "编译期常量值: " << compile_time_const << std::endl;
    return 0;
}

constexpr修饰函数

constexpr还可以修饰函数,这类函数在传入编译期可确定的参数时,会在编译阶段直接计算返回值,不需要等到运行时调用。如果传入的参数包含运行时变量,那么函数会退化为普通函数,在运行时执行。

#include <iostream>

// constexpr函数,参数和返回值都必须是编译期可确定的类型
constexpr int add(int a, int b) {
    return a + b;
}

int main() {
    // 编译期计算,结果在编译阶段就已经确定
    constexpr int result1 = add(10, 20);
    // 运行时计算,因为参数包含运行时变量
    int x = 30;
    int result2 = add(x, 40);
    
    std::cout << "编译期计算结果: " << result1 << std::endl;
    std::cout << "运行时计算结果: " << result2 << std::endl;
    return 0;
}

constexpr的优化作用

constexpr的优化主要体现在减少运行时开销上,编译期计算的结果会被直接嵌入到程序的二进制代码中,不需要额外的函数调用和计算过程。比如在数组大小定义、模板参数传递等场景中,使用constexpr可以避免运行时的动态内存分配或计算。

#include <iostream>
#include <array>

constexpr int get_array_size() {
    return 5;
}

int main() {
    // 编译期确定数组大小,不需要运行时计算
    std::array<int, get_array_size()> arr = {1, 2, 3, 4, 5};
    for (int i = 0; i < arr.size(); ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;
    return 0;
}

使用constexpr的注意事项

  • constexpr变量和函数的返回值必须在编译阶段可确定,不能包含运行时才能获取的值,比如用户输入、随机数生成结果等。
  • C++11中constexpr函数体只能包含一条return语句,C++14及之后版本放宽了限制,允许包含循环、变量定义等逻辑,但所有计算仍必须能在编译期完成。
  • constexpr修饰的变量默认具有静态存储期,如果是全局或静态的constexpr变量,会存放在程序的只读数据段中。

适用场景总结

当需要在编译阶段确定常量值、减少运行时计算开销、或者需要向模板、数组大小等要求编译期常量的场景传递参数时,就可以使用constexpr。它既保证了常量的不可修改性,又能带来编译期优化的收益,是C++中提升性能的重要特性之一。

constexprC++编译期常量常量表达式优化修改时间:2026-06-26 02:39:23

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。