逆向基础--C++ 存储类 (04)

news/2025/11/11 10:50:54/文章来源:https://www.cnblogs.com/MrHSR/p/19205366

逆向基础--C++ 存储类 (04)

一.存储类介绍

  C++ 存储类用于定义变量/函数的生命周期和可见性。它们说明了变量在程序中的存储位置以及如何被访问。下面列出 C++ 程序中可用的存储类:

   1) auto (自动存储类)  

    在C++11之前,auto关键字用于声明自动存储期的局部变量。但是,在C++11中,auto的用法已经改变,现在它用于类型推断,如:auto x = 10; // x被推断为int。

  2)register(寄存器存储类)

    将变量存储在CPU寄存器中以提高访问速度。在 C++11 及以后的版本中,register 已经是一个废弃的特性,不再具有实际作用。

  3)static(静态存储类)

    用于定义具有静态存储期的变量或函数,它们的生命周期贯穿整个程序的运行期。在程序的生命周期内保持局部变量的存在,而不需要在每次进入和离开作用域时进行创建和销毁。

  4)extern(外部存储类)

    用于声明具有外部链接的变量或函数,它们可以在多个文件之间共享。默认情况下,全局变量和函数具有 extern 存储类。在一个文件中使用extern声明,另一个文件中定义的全局变量或函数,可以实现跨文件共享。

  5)mutable(C++11 可变存储类)

    用于修饰类中的成员变量,允许在const成员函数中修改这些变量的值。通常用于缓存或计数器等需要在const上下文中修改的数据。

  6)thread_local (C++11 线程局部存储)

    用于在多线程环境中管理线程特有的变量。使用 thread_local 修饰的变量在每个线程中都有独立的实例,因此每个线程对该变量的操作不会影响其他线程。线程局部变量的生命周期与线程的生命周期相同。

    ---独立性:每个线程都有自己独立的变量副本,不同线程之间的读写操作互不干扰。

    ---生命周期:thread_local 变量在其线程结束时自动销毁。

    ---初始化:thread_local 变量可以进行静态初始化或动态初始化,支持在声明时初始化。s

 

二. static静态存储类

#include <iostream>
// 函数声明 
void func(void);static int count = 10; /* 全局变量 */int main()
{while(count--){func();}return 0;
}
// 函数定义
void func( void )
{/*我们注意到C++中的局部静态变量在函数内部声明,但它的生命周期是整个程序运行期,并且只初始化一次。生命周期持续到程序结束作用域仅限于该函数内部所以循环调用func()函数时,i变量的值是递增的。注意:C#不允许在函数(方法)内部定义静态变量,静态变量是属于类的*/static int i = 5; // 局部静态变量,整个程序运行期间,只初始化一次i++;std::cout << "变量 i 为 " << i ;std::cout << " , 变量 count 为 " << count << std::endl;
}

image

 

三.extern 外部存储类

  extern用于声明一个变量或函数,是在其他.cpp文件中定义的(即外部链接)

//-----------------ConsoleApplication1.cpp-------------------------
#include <iostream>
//定义了全局的变量,未初始化,默认初始化为0
int count;
/*声明了一个函数, 该函数在support.cpp文件中定义,这里使用extern关键字表示该函数是外部定义的。在函数声明中,extern关键字可以省略,因为函数默认具有外部链接
*/
extern void write_extern();
// void write_extern() //extern关键字可以省略
int main()
{count = 5;write_extern();
}//-----------------support.cpp-------------------------
#include <iostream>
/*使用extern关键字声明变量count,表示这个变量在外部(文件ConsoleApplication1.cpp)定义这样,文件support.cpp就可以使用文件ConsoleApplication1.cpp中定义的全局变量count
*/
extern int count;
//定义了函数write_extern,该函数打印出count的值。
void write_extern(void)
{//输出: Count is 5std::cout << "Count is " << count << std::endl;
}

  extern一般可以用在:多文件(.cpp)共享全局变量、分离编译和链接、声明在其他文件中定义的函数、与C代码交互。

  缺点是: extern变量是全局的,容易导致全局状态混乱,不易维护。

//--------------多文件共享全局变量----------------------------------------------------
// config.cpp
int globalConfig = 42;// other.cpp
extern int globalConfig;
void useConfig() {std::cout << globalConfig;
}//-----------------分离编译和链接----------------------------------------------------
//在头文件中使用extern声明全局变量,然后在其中一个源文件中定义// config.h
extern int globalConfig;// config.cpp
#include "config.h"
int globalConfig = 42;//------------声明在其他文件中定义的函数------------------------------------------------
// math_utils.h
extern int add(int a, int b);// math_utils.cpp
int add(int a, int b) {return a + b;
}// main.cpp
#include "math_utils.h"
int main() {add(1, 2);
}//-------------与C代码交互----------------------------------------------------------
//在C++代码中引用C语言编写的库中的函数和变量时,需要使用extern "C"来确保按照C语言的名称修饰规则进行
// 引用C库中的函数
extern "C" {#include "c_library.h"
}

 

四.mutable 可变存储类

//包含输入输出流 头文件,用于使用 std::cout
#include <iostream> //定义一个名为 Counter 的类
class Counter {// 私有访问区域,外部代码不能直接访问这里的成员
private:             mutable int count;  // mutable 关键字:允许在 const 函数中修改这个变量// 公共访问区域,外部代码可以访问这里的成员
public:              // 构造函数:在创建对象时自动调用// Counter() 是构造函数名,与类名相同// : count(0) 是初始化列表,在对象创建时直接将 count 初始化为 0// {} 是构造函数的空函数体Counter() : count(0) {}// const 成员函数,这个函数不能修改普通的成员变量// 但由于count是 mutable,所以可以修改它// 这样的函数叫常量成员函数void increment() const {  count++;              // 递增 countstd::cout << "Count: " << count << std::endl;  // 输出当前计数
    }
};int main() {                    const Counter c;            // 创建常量 Counter 对象,对象创建后不能修改c.increment();              // 调用 increment 方法,输出: Count: 1c.increment();              // 再次调用,输出: Count: 2
}   

  适用场景:

      1)缓存:在 const 函数中计算并缓存结果,而不影响对象的外部状态。

      2)状态跟踪:如日志计数器,跟踪调用次数等信息,避免对类的逻辑进行侵入式修改。

 

五.thread_local 线程局部存储

#include <iostream>   // 用于输入输出
#include <thread>     // 包含 C++ 标准线程库// thread_local 关键字:每个线程都有自己独立的变量副本
// 每个线程修改这个变量不会影响其他线程的副本
thread_local int threadSpecificVar = 0;// 线程函数 - 每个线程都会执行这个函数
void threadFunction(int id) {// 设置当前线程特有的变量值// 这个修改只会影响当前线程的 threadSpecificVar 副本threadSpecificVar = id;// 输出当前线程的 ID 和它特有的变量值// 每个线程都会看到自己设置的值,不会受到其他线程的影响std::cout << "Thread " << id << ": threadSpecificVar = " << threadSpecificVar << std::endl;
}int main() {// 创建线程 t1,让它执行 threadFunction 函数,并传递参数 1// std::thread 构造函数接受函数指针和参数// 线程在创建后立即开始执行std::thread t1(threadFunction, 1);// 创建线程 t2,让它执行 threadFunction 函数,并传递参数 2std::thread t2(threadFunction, 2);// join() 方法:主线程等待 t1 线程执行完成// 如果不调用 join(),程序可能会在主线程结束时终止所有未完成的线程
    t1.join();// 主线程等待 t2 线程执行完成
    t2.join();// 注意:主线程也有自己独立的 threadSpecificVar 副本// 这里主线程没有使用它,所以保持初始值 0return 0;  // 程序正常退出
}

image

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/962155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

题解:P10136 [USACO24JAN] Cowlendar S

鸽巢原理,比较思维早上打模拟赛败在你上面,下午改题改了半天,晚上又在 Ad-hoc 题单里相见,那我就写篇题解纪念。 题目链接 思路 一般这种取模题三个套路:取模余数相同 \(\rightarrow\) 作差之后值为模数的倍数; …

WinForm中C#扫描枪功能实现(含USB/串口方案)

一、技术选型与设备连接 1. 扫描枪连接方式对比类型 通信协议 适用场景 实现复杂度USB模拟键盘 HID协议 快速部署,无需驱动 ★☆☆☆☆串口通信 RS-232/USB转串 工业级设备,定制化需求 ★★★☆☆网络通信 TCP/IP 远…

类方法和静态方法

@classme Python会自动绑定类方法的第一个参数,类方法的第一个参数(通常定义为cls)会自动绑定到类本身 但对于静态方法则不会自动绑定

实用指南:新手上手:基于Rokid CXR-M和CXR-S SDK构建简易翻译助手

实用指南:新手上手:基于Rokid CXR-M和CXR-S SDK构建简易翻译助手pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

2025年新疆租车公司权威推荐榜单:新疆自驾游租车/新疆租皮卡车/新疆租通勤班车服务公司精选

广袤天地间,一辆靠谱的车是你探索新疆的最佳旅伴。 随着新疆旅游市场持续升温,2024年全区接待游客突破2.5亿人次,租车自驾作为灵活自由的出行方式,市场需求显著增长。 据行业数据显示,2025年新疆租车市场规模预计…

基于C#和NModbus4库实现的Modbus RTU串口通信

基于C#和NModbus4库实现的Modbus RTU串口通信,包含完整的界面设计和功能实现:一、项目依赖配置NuGet包安装: Install-Package NModbus4 Install-Package System.IO.Ports窗体控件布局: <!-- 基础控件配置 -->…

学习如何创建 Mono 实例

学习如何创建 Mono 实例 Flux 描述 AMono<T>是一个响应式流 Publisher,还增强了许多可用于生成、转换、编排 Mono 序列的操作符。 它是最多 Flux 可以发出 1 个<T>元素的特例:Mono 要么有值(包含元素)…

go_micro框架的安装和使用 - 详解

go_micro框架的安装和使用 - 详解2025-11-11 10:40 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !impor…

2025年超融合产品推荐排行榜

2025年超融合产品推荐排行榜拓实超融合产品 - 综合评分第一产品亮点 一体化架构:计算、存储、网络深度融合 智能运维:自动化部署与智能监控 高可用性:99.99%业务连续性保障 弹性扩展:按需扩容,灵活配置 技术优势 …

2025年北京cppm面授培训机构权威推荐榜单:cppm课程培训/cppm认证报名/cppm认证培训源头机构精选

在当今全球化的商业环境中,采购与供应链管理已成为企业核心竞争力的重要组成部分。CPPM(注册职业采购经理)认证作为采购与供应链领域的权威职业资格,其市场需求量年均增长率稳定在15%以上,已成为众多企业选拔和评…

N-gram

📝 N-gram 1. N-gram 的定义 N-gram 是指一段文本中连续出现的 N 个词或字符的序列。它是一种特征工程(Feature Engineering)技术,将文本数据转化为机器学习模型可以理解的数字特征。N 是一个变量,代表序列的长…

pandas介绍

pandas介绍关于数学统计的各种运算,及文件读写的数学库

图像处理工具面面观:数字化时代的图片管理方案

在数字化生活普及的今天,图片已成为我们记录生活、开展工作的重要载体。无论是社交分享还是专业设计,都离不开对图像的基础处理。近期,一些集成式在线图片处理工具因其便捷性受到关注,它们将多种常用功能整合于同一…

实用指南:前端性能优化?

实用指南:前端性能优化?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &…

2025年北京cppm报考机构权威推荐榜单:cppm/cppm证书/cppm课程培训源头机构精选

在当今全球化的商业环境中,采购与供应链管理已成为企业核心竞争力的重要组成部分。CPPM(注册职业采购经理)认证作为采购与供应链领域的权威职业资格,其市场需求量年均增长率稳定在15%以上,已成为众多企业选拔和评…

可见光通信(VLC)系统中单点光源功率分布模型

可见光通信(VLC)系统中单点光源功率分布模型的理论框架与分布趋势分析,结合几何光学原理和工程优化方法:一、理论基础模型 1. 朗伯辐射模型 单点光源的光功率分布通常基于朗伯辐射定律: E(r,θ)=r2I0cosmθI0:光…

2025年云桌面公司排行榜

2025年云桌面公司排行榜:北京拓实科技引领行业创新随着数字化转型的深入发展,云桌面技术已成为企业信息化建设的重要组成部分。2025年,云桌面市场呈现出更加成熟和多元化的竞争格局。以下是基于技术实力、产品创新、…

2025年个体户代办渠道排行榜单

2025年个体户代办渠道排行榜单一、2025年个体户代办服务市场概况随着数字经济时代的到来,个体户创业热潮持续升温,代办服务行业也迎来了新一轮发展机遇。2025年,个体户代办服务呈现出专业化、智能化、合规化的发展趋…

2025年节能型速冻隧道销售厂家排行

2025年节能型速冻隧道销售厂家排行随着节能环保理念的深入,节能型速冻隧道在食品加工、医药等行业的应用越来越广泛。根据2025年市场调研数据,以下是节能型速冻隧道销售厂家的权威排行:一、行业领先企业排行1. 吉林…

vue3.0实现数组分组效果

效果图vue3.0+element-plus拖拽效果 vue-draggable-plus父组件使用<column-dialog :options="fields"v-model="content"></column-dialog>子组件 ColumnDialog/index.vue<template…