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

c++11 constexpr关键字

constexpr 是 C++11 引入的一个关键字,它允许在编译时计算表达式的值,并将这些值存储在程序的常量部分中。这意味着 constexpr 变量和函数可以在编译时进行求值,从而避免了运行时的开销。

constexpr变量

constexpr 变量必须在编译时初始化,并且其值在程序的整个生命周期中都是常量。它们通常用于定义那些可以在编译时确定的常量值。

constexpr int x = 10;  // 正确  
constexpr int y = x + 5;  // 正确,因为 x 是一个 constexpr  int z = 15;  
constexpr int w = z;  // 错误,因为 z 不是一个 constexpr
constexpr函数

constexpr 函数是那些可以在编译时评估的函数。这些函数必须满足以下条件:

  1. 返回值类型必须是字面值类型(如整数、浮点数、枚举、指向字面值类型的指针或字面值类型的聚合体)。
  2. 函数体必须只包含一条单一的 return 语句(在 C++14 中,这个限制被放宽了)。
  3. 函数内部不能有复杂的控制流(如循环、分支)。
    constexpr int factorial(int n) {  return n <= 1 ? 1 : n * factorial(n - 1);  // 注意:虽然这里有一个递归调用,但它是在编译时展开的(对于较小的 n 值)  
    }  constexpr int fiveFactorial = factorial(5);  // 编译时计算,值为 120
constexpr在模板中的应用 

constexpr 在模板编程中特别有用,因为它允许在编译时计算模板参数的值。这可以用于实现诸如固定大小数组或优化等功能。

以下是基于c++11给出的代码示例:

//---constexpr (const)
//表达“常量”语义用 constexpr	表达“只读”语义用 const
template<class T>
constexpr T func(T t)
{return t;
}//根据传入的t来确定constexpr是否有效,有无效均不影响调用
class Base {
public:constexpr Base(int a):a(a){}int a;
};
constexpr int func()
{constexpr int a = 10;constexpr int b = 20;constexpr int c = a + b;return c + a * b;
}//constexpr修饰的函数为 常量表达式函数
//函数体内部只能存在常量表达式以及using指令、typedef语句、static_assert断言、return语句
int main()
{constexpr Base ba(10);constexpr int ret = ba.a;return 0;
}
c++14和c++17对constexpr的改进
  • 在 C++14 中,constexpr 函数的限制被放宽,允许函数体内有多个语句和更复杂的控制流。
  • C++17 进一步扩展了 constexpr 的使用,允许在 constexpr 函数中使用 ifswitchforwhile 和 do-while 等控制流语句,以及更复杂的表达式。
注意事项:
  • 不是所有的编译器都支持 C++11、C++14 或 C++17 中的所有 constexpr 功能。
  • 在使用 constexpr 时,要注意避免产生无限递归或编译时无法确定的表达式。
  • constexpr 变量和函数主要用于性能优化和类型安全,但它们也可能使代码更难理解和维护。因此,在使用时应权衡其优缺点。

 

http://www.lryc.cn/news/365242.html

相关文章:

  • ios 获取图片的一部分区域
  • 数据结构(3)栈、队列、数组
  • 数据库(入门)
  • ChatTTS+Python编程搞定语音报时小程序
  • 【Mac】Alfred 5 for Mac(苹果效率提升工具)v5.5软件介绍及安装教程
  • PDF文件处理不再复杂:9个Python库让一切变得简单
  • 安防视频融合汇聚平台EasyCVR如何实现视频画面自定义标签?
  • Liunx音频
  • 2024前端面试准备3-JS异步-进阶
  • lm studio 0.2.24国内下载模型
  • 卷积池化尺寸计算公式
  • 前端框架原理自测题:根据 JSX / Vue 模板写出 render 函数 / VNode
  • RabbitMQ启动报错:Error during startup: {error, {schema_integrity_check_failed,
  • 操作系统入门系列-MIT6.828(操作系统工程)学习笔记(三)---- xv6初探与实验一(Lab: Xv6 and Unix utilities)
  • Java核心: 为图片生成水印
  • Spark MLlib 机器学习详解
  • MySQL报ERROR 2002 (HY000)解决
  • 【校招】【社招】字节跳动UG营销算法工程师招聘
  • Go实战 | 使用Go-Fiber采用分层架构搭建一个简单的Web服务
  • Web自动化测试框架+PO模式分层实战(超细整理)
  • 光猫、路由器的路由模式、桥接模式、拨号上网
  • iOS--工厂设计模式
  • [Python]用Qt6和Pillow实现截图小工具
  • Podman和Docker的区别
  • Go微服务: 分布式Cap定理和Base理论
  • Mysql学习(四)——SQL通用语法之DQL
  • 【ARFoundation自学05】人脸追踪(AR Face manager)实现
  • Vulnhub-DC-2
  • VNC server ubuntu20 配置
  • c++--priority_queue和仿函数