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

[c++11]constexpr

const

const关键字用于声明常量或指示编译器变量不可修改

声明常量:

使用const关键字可以声明常量,即变量的数值在初始化后不能被修改。

const int MAX_VALUE = 100;

保护数据:

将成员函数声明为const可以确保这些函数不会修改对象的状态。const成员函数可以在const对象上调用,但不能修改对象的成员变量。

class MyClass {
public:int getValue() const; // const成员函数
};

避免意外修改:

将函数参数声明为const可以避免意外修改参数的值。

void printValue(const int num); // 参数num为常量,不能在函数内部修改其值

防止指针修改:

指针前加const可将指针本身设为常量,防止指针修改指向的对象;
指针后加const可将指针指向的对象设为常量,防止修改对象。

const int* ptr; // 指向常量的指针,不能通过该指针修改所指向的值
int* const ptr = &value; // 常量指针,指针本身不可修改
const int* const ptr = &value; // 指向常量的常量指针,指针本身和指向的值都不能修改

constexpr

在C++中,constexpr是一个关键字,用于声明变量或函数为常量表达式。常量表达式指的就是由多个(≥1)常量(值不会改变)组成并且在编译过程中就得到计算结果的表达式。

使用constexpr可以将变量或函数声明为常量表达式,从而在编译时进行求值,并在运行时减少计算开销。在C++11及之后的标准中,constexpr被广泛用于定义常量、模板参数、数组大小等。

声明常量变量:

constexpr int constant = 42; // 声明一个常量

函数声明为常量表达式:

constexpr int square(int x) {return x * x;
}

使用constexpr修饰类成员函数:

class MyClass {
public:constexpr int getValue() const {return value;}private:int value = 10;
};

在数组大小中使用constexpr:

constexpr int size = 5;
int arr[size]; // 创建一个大小为5的数组

const和constexpr的区分:

表达“只读”语义的场景都使用 const
表达“常量”语义的场景都使用 constexpr

volatile关键字

C++ 中有一个volatile关键字,用于告诉编译器该变量可能会在意料之外被修改,因此编译器不应该对其进行优化

在多线程或嵌入式系统中,volatile 关键字通常用于声明那些可能被其他程序、硬件或操作系统更改的变量。
这样一来,编译器就不会对这些变量的访问进行优化,以确保每次都从内存中读取值,而不是依赖于寄存器中的缓存值。

volatile 主要有以下几个作用:
- 告诉编译器不要对变量进行优化,避免出现意料之外的行为。
- 在并发编程中确保对变量的访问是可见的,避免出现由于优化导致的问题。
- 用于与硬件交互的变量,如控制寄存器、中断服务程序等。

需要注意的是,volatile 主要用于标记变量可能随时被修改的情况,而不是用于解决线程同步问题。
在多线程编程中,应当使用更为专门的同步机制来确保线程安全性。

http://www.xdnf.cn/news/15972.html

相关文章:

  • MCP消息协议和传输协议(Java角度)
  • 【数学建模|Matlab】Matlab「基础知识」和「基础操作」
  • es搜索实现既能模糊查询又能分词查询
  • Linux部署.net Core 环境
  • 8.4 Java 原生 TCP Socket 实现 HTTP 请求解析和请求分发
  • Dify接入MCP案例1:基于Chatflow旅行、吃饭、新闻、学习的AI智能体
  • 公司内部网址怎么在外网打开?如何让外网访问内网的网站呢?
  • 2025 年非关系型数据库全面指南:类型、优势
  • cddlib(用于凸多面体计算和线性不等式系统求解)的开源库
  • JAVA API (三):从基础爬虫构建到带条件数据提取 —— 详解 URL、正则与爬取策略
  • Java 大视界 -- Java 大数据在智能交通自动驾驶车辆与周边环境信息融合与决策中的应用(357)
  • JMeter 实现 Protobuf 加密解密
  • UE5 UI 水平框
  • ansible 批量 scp 和 load 镜像
  • MybatisPlus-16.扩展功能-枚举处理器
  • Windows PE文件内未用空间学习
  • DNS应用层协议
  • Linux驱动-中断-共享队列
  • 两个android,一个客户端一个服务器端
  • 2025.7.22 测试 总结
  • Web服务器(Tomcat、项目部署)
  • C# 中的装箱与拆箱
  • 今日行情明日机会——20250722
  • 基于AutoJawSegment项目的CBCT图像分割实践指南
  • 【bug】Yolo11在使用tensorrt推理numpy报错
  • Java 中 String 类的常用方法
  • OneCode 3.0 @TreeAnnotation及@ChildTreeAnnotation子树注解速查手册
  • 生存分析机器学习问题
  • 数据交换---JSON格式
  • IDEA-通过IDEA导入第三方的依赖包