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

[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.dtcms.com/a/293376.html

相关文章:

  • 考研数据结构Part1——单链表知识点总结
  • 陷波滤波器设计全解析:原理、传递函数与MATLAB实现
  • Netty中AbstractReferenceCountedByteBuf对AtomicIntegerFieldUpdater的使用
  • 威胁情报:Solana 开源机器人盗币分析
  • Automotive SPICE
  • git的版本冲突
  • 大模型——Data Agent:超越 BI 与 AI 的边界
  • 用ESP32打造全3D打印四驱遥控车:无需APP的Wi-Fi控制方案
  • 从0开始的中后台管理系统-2
  • 课题学习笔记2——中华心法问答系统
  • 汽车行业数字化——解读52页汽车设计制造一体化整车产品生命周期PLM解决方案【附全文阅读】
  • 记录更新时间用java的new date还是数据库的now
  • 深入理解 C 语言数据类型:从内存到应用的全面解析
  • CAN基础知识 - 进阶版
  • 消息推送功能设计指南:精准触达与用户体验的平衡之道
  • Spring Boot 中集成ShardingSphere-JDBC的基本使用
  • Kibana报错[security_exception] current license is non-compliant for [security]
  • HCIA/IP(一二章)笔记
  • TTL+日志的MDC实现简易链路追踪
  • 强化学习理论
  • 计算机是怎么样工作的
  • 在 Ubuntu 22.04 上安装并优化 Nginx nginx入门操作 稍难,需要有一定理论 多理解 多实践
  • Class13预测房价代码
  • Google Gemini 体验
  • 从零开始学CTF(第二十五期)
  • 万界星空科技铜线/漆包线行业智能化MES系统解决方案
  • postgresql导入导出数据;pg_restore: error: did not find magic string in file header
  • 基础算法思想(递归篇)
  • 厚铜板载流革命与精密压合工艺——高可靠性PCB批量制造的新锚点
  • Android AppCompat:实现Material Design向后兼容的终极指南