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

C++11新特性之constexpr

1.介绍 

        constexpr是C++11标准引入的关键字,用于声明常量表达式,其目的是让一些计算在编译时就能完成,从而提高程序的性能与安全性。(因为只需要执行一次)

        在介绍其用法前,先解释一下常量表达式的含义。

        常量表达式指的是由多个常量组成的表达式,其成员都为常量,其值无法修改。

例如:

int num[10];//正确

int num[6 + 4];//正确

int length = 10;
int num[length];//错误,length是变量

        第一个和第二个都是常量表达式,第三个不是,因为length是变量。

2.constexpr用法

        (1)constexpr修饰普通变量。

constexpr int num = 10;

        这里num就是个编译时常量,编译器在编译阶段就知道它的值为10;

        (2)constexpr修饰函数。

constexpr int add(int a, int b) {
    return a + b;
}

        这种函数称为常量表达式函数。需要满足以下条件:

        1.只能包含一条返回语句,不能进行其他操作。

        2.函数必须有返回值,且为常量。

        (3)constexpr修饰类的构造函数

        对于C++内置类型的数据,可以直接用constexpr修饰,但自定义的数据类型,直接用constexpr修饰是不行的。若想自定义一个可产生常量的类型,需要在该类型的内部添加一个常量构造函数。例如:


//自定义类型的定义
struct myType {
    constexpr myType(char *name,int age):name(name),age(age){};
    const char* name;
    int age;
    //其它结构体成员
};

注意事项:该构造函数的函数体需为空,且采用初始化列表的方式赋值时必须使用常量表达式。

        (4)constexpr修饰模版函数

        constexpr可以修饰模版函数,但由于其类型的不确定性,模版实例化后的函数是否符合常量表达式也不确定。因此,C++11规定,模版函数实例化结果不满足常量表达式的,自动忽略constexpr。函数就相当于一个普通函数了。

#include <iostream>
using namespace std;
//自定义类型的定义
struct myType {
    const char* name;
    int age;
    //其它结构体成员
};
//模板函数
template<typename T>
constexpr T dispaly(T t){
    return t;
}
int main()
{
    struct myType stu{"zhangsan",10};
    //普通函数
    struct myType ret = dispaly(stu);
    cout << ret.name << " " << ret.age << endl;
    //常量表达式函数
    constexpr int ret1 = dispaly(10);
    cout << ret1 << endl;
    return 0;
}

3.constexpr与const的区别

        C++11标准中,将两者功能进行了划分:

                凡是表达“只读”语义的场景都用const。

                凡是表达“常量”语义的场景都用constexpr。 

        但在大部分情况下,二者是可以混用的。

4.总结

        创建constexpr关键字的核心还是为了优化程序的执行效率。因此,在使用时就围绕这个方向进行使用,使程序执行效率达到最优。


http://www.kler.cn/a/531249.html

相关文章:

  • 解决PyG安装中torch-sparse安装失败问题:详细指南
  • QT交叉编译环境搭建(Cmake和qmake)
  • 2025年1月个人工作生活总结
  • 【单层神经网络】基于MXNet的线性回归实现(底层实现)
  • WSL2中安装的ubuntu开启与关闭探讨
  • OpenAI 实战进阶教程 - 第二节:生成与解析结构化数据:从文本到表格
  • Machine Learning Engineering Open Book 机器学习工程开放书
  • 八、Spring Boot 日志详解
  • 带负权值的图如何计算最短路径?
  • w190工作流程管理系统设计与实现
  • Nginx反向代理 笔记250203
  • web-SQL注入-CTFHub
  • 55【ip+dns+域名关系】
  • 说说 Java 中 HashMap 的原理?
  • 51单片机看门狗系统
  • 测试方案和测试计划相同点和不同点
  • 路径规划之启发式算法之二十九:鸽群算法(Pigeon-inspired Optimization, PIO)
  • Ubuntu修改配置文件--编辑操作
  • 攻防世界_php_rce(ThinkPHP框架)
  • FreeRTOS学习 --- 时间管理(相对延时和绝对延时)
  • Python基础-使用list和tuple
  • 树莓派pico入坑笔记,触摸引脚
  • Python从0到100(八十七):CNN网络详细介绍及WISDM数据集模型仿真
  • 软件审批源码,软件审批流程,流程设计器(JAVA代码)
  • idea找不到或无法加载主类怎么解决
  • The Simulation技术浅析(四):随机数生成