C++存储类

2023-05-16

存储类定义C++程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出C++程序中可用的存储类:

  • auto
  • register
  • static
  • extern
  • mutable
  • thread_local(C++ 11)

从C++ 11开始,auto 关键字不再是C++ 存储类说明符,且 register 关键字被弃用。


auto存储类

自C++ 11以来,auto 关键字用于两种情况:声明变量时根据初始化表达式自动推断该变量的类型、声明函数返回值的占位符。

C++98标准中auto关键字用于自动变量的声明,但由于使用极少且多余,在C++ 11中已删除这一用法。

根据初始化表达式自动推断被声明的变量类型,如:

auto f = 3.14;             //double 
auto s("hello");           //const char*
auto z = new auto(9);      //int*
auto x1 = 5, x2 = 5.0, x3 = 'r';   //错误,必须是初始化为同一类型 

register存储器

register 存储器用于定义存储在寄存器而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常时一个词),且不能对它应用一元‘&’运算符(因为它没有内存位置)。

{
   register int miles;
}

寄存器只用于需要快速访问的变量,比如计数器。还应注意的是,定义‘register’并不意味着变量将被存储在寄存器中,它意味着变量可能存储在寄存器中,这取决于硬件和实现的限制。


static存储器

static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用static修饰局部变量可以在函数调用之间保持局部变量的值。

static修饰符也可以应用于全局变量。当static修饰全局变量,会使变量的作用域限制在声明它的文件内。

在C++中,当static用在类数据成员上时,会导致仅有一个该成员的副本被类的所有对象共享。

#include <iostream>

//函数声明
void func(void);

static int count = 10; /*全局变量*/

int main()
{
	while(count--)
	{
		func();
	}
	
	return 0;
 }
 
 //函数定义
 void func( void )
 {
 	static int i = 5;  //局部静态变量
	i++;
	std::cout << "变量 i 为" << i;
	std::cout << " , 变量 count 为 " << count << std::endl; 
  } 

结果为:


extern存储类

extern存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当使用'extern'时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。

当有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理解, extern 是用来在另一个文件中声明一个全局变量或函数。

extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候。


thread_local存储类

使用 thread_local 说明符声明变量仅可在它在其上创建的线程上访问。变量在创建线程时创建,并在销毁线程时销毁。每个线程都有其自己的变量副本。

thread_local 说明符可以与 static 或 extern 合并。

可以将 thread_local 仅用于数据声明和定义, thread_local不能用于函数声明或定义。

下面演示了可以被声明为 thread_local 的变量:

thread_local int x;     //命名空间下的全局变量
class X
{
	static thread_local std::string s;   //类的static成员变量
 
};
static thread_local std::string X::s;    //X::s 是需要定义的

void foo()
{
	thread_local std::vector<int> v;     //本地变量 
 } 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++存储类 的相关文章

随机推荐

  • 【对比实验的坑】

    图像处理对比算法是踩过的坑 1 首当其冲 xff1a 保存数据的格式 其他人的算法 xff0c 即便公开了代码 xff0c 大概率也得再做调整 xff0c 或者配置环境 他们保存数据的方式并不是适合求取误差或者跟自己算法相同colormap
  • STM32F4 UART基础(HAL库)

    文章目录 概述 96 UART 96 初始化 96 UART 96 参数初始化 96 UART 96 句柄 96 UART 96 初始化结构体 96 UART 96 参数初始化函数 96 UART 96 时钟初始化 96 UART GPIO
  • 【GCC】通过参数-fno-elide-constructors关闭g++的编译优化

    变量定义成 volatile xff0c 避免优化掉 原文 xff1a https blog csdn net songguangfan article details 89049612 前两天在做讲课资料的时候遇到一个比较坑的问题 一般来
  • 【Jmeter】Jmeter压力测试工具安装及使用教程(redis测试)

    摘自 xff1a https www cnblogs com monjeo p 9330464 html 一 Jmeter下载 进入官网 xff1a http jmeter apache org 1 第一步进入官网如下图 2 选择进行下载
  • 【数据库】Redis和RocksDB、levelDB的区别

    区别 Redis 是一个服务 xff0c 独立的进程 xff0c 用户的程序需要与它建立连接才能向它发请求 xff0c 读写数据 RocksDB 和LevelDB 是一个库 xff0c 嵌入在用户的程序中 xff0c 用户程序直接调用接口读
  • Kerloud VTOL垂直起降固定翼飞机发布

    产品简介 垂直起降 xff08 VTOL Vertical Take off and Landing xff09 固定翼无人机具备独特的构型 xff0c 凭借自身起降方便 续航持久等优势 xff0c 成为近年来在军事 工业 农业等领域中最具
  • 【Linux】用户和用户组|将用户添加到root组中

    添加组 usermod a G root dev 修改dec的用户组为root usermod g root dec 删除组用户dev的用户组root gpasswd d dev root 将用户dev加入到root组 gpasswd a
  • 【ethtool】ethtool 网卡诊断、调整工具、网卡性能优化| 解决丢包严重

    目录 即看即用 详细信息 软件简介 安装 ethtool的使用 输出详解 其他指令 将 ethtool 设置永久保存 如何使用 ethtool 优化 Linux 虚拟机网卡性能 ethtool 解决网卡丢包严重和网卡原理 即看即用 查看 x
  • 【C++】undefined reference to找不到符号问题汇总及解决方法

    目录 1 链接时缺失了相关目标文件 o 2 链接时缺少相关的库文件 a so 3 链接的库文件中又使用了另一个库文件 4 多个库文件链接顺序问题 5 定义与实现不一致 6 在c 43 43 代码中链接c语言的库 7 C 43 43 中类中静
  • 【SNMP】snmp trap 介绍、安装、命令|Trap的发送与接收代码实现

    目录 零 简略 一 SNMP简单概述 1 1 什么是Snmp 1 2 为什么需要SNMP xff1f 1 3 SNMP的基本组件 1 4 SNMP 和 UDP 1 5 Snmp版本 二 Snmp有关的基本概念 2 1 代理和管理站的模型 2
  • 【MYSQL】同时查询两个表并将结果合并到一起

    目录 从两个表中查不同字段并拼接到一起 从两个表中查的字段不一样 将两个表结果合并 从两个表中查的字段一样 SQL多表合并UNION ALL和UNION 从两个表中查不同字段并拼接到一起 从两个表中查的字段不一样 SELECT 表1 字段1
  • 【TCP/IP】TCP/IP 四层协议|四层/五层/OSI七层协议

    目录 前言 五层协议模型 四层 gt 五层 gt 七层协议模型 四层 gt 五层 gt 七层协议 4层的是TCP IP模型 xff0c 7层的是OSI模型 五层 七层协议 前言 本文持续更新 地址 xff1a http t csdn cn
  • 【MSP430中断】MSP430的IO口中断/中断特性|Px中断进不去 原因

    目录 MSP430学习笔记之七 xff1a IO口中断 端口中断进不去 Px中断进不去 原因 MSP430学习笔记之七 xff1a IO口中断 MSP430中断嵌套机制 1 430默认的是关闭中断嵌套的 xff0c 除非你在一个中断程序中再
  • 【IAR 】MSP430 IAR 编译报错:error

    关于转载的说明 xff1a 原文内容可能会不断更新 xff0c 要想得到最新的内容请跳到到原文看 无编号警告类型 xff1a 1 Sat Jun 23 2012 17 41 05 The stack pointer for stack 39
  • 【物联网】AT指令|AT返回错误|AT 指令 收发短信和GPRS上网 SIM508/548

    目录 常用AT命令解释 AT 指令 收发短信和GPRS上网 SIM508 548 AT指令返回错误 解释 CME错误 xff1a CMS错误 CME错误 英文 CMS 错误 英文 短信通信的几种情况和CMS错误 常用AT命令解释 一 AT命
  • DASA异构机器人集群科技教育方案

    DASA异构机器人集群科技教育方案 愿景主要特征基础设施完善室内室外全局定位软件接口兼容统一虚拟仿真快速验证演示程序详细讲解 功能展示无人机集群仿真异构机器人自主飞行 更多信息 愿景 近年来 xff0c 中国已成为各类机器人应用增长最快的国
  • STM32 系列使用知识问题笔记

    STMF103用了这么多年 xff0c 项目也做过不少 xff0c 当然也遇到过很多问题 xff0c 虽然现在使用起来也算得上得心应手 xff0c 但是有些地方还是用起来还是得查查看看 xff0c 所以就专门开设一篇文章 xff0c 放一些
  • STM32的内存管理相关(内存架构,内存管理,map文件分析)

    把以前看过的做过的笔记 xff0c 还有网上参考的部分好文章 xff0c 利用十一假期好好梳理了一遍 xff0c 希望对大家也对自己以后查看有帮助 梳理章节架构 xff0c 完善内容 2021 10 6 2021 10 7 5 1 STM3
  • FreeRTOS记录(四、FreeRTOS任务堆栈溢出问题和临界区)

    本来计划是消息队列 信号量 任务通知 事件集 邮件的文章 但是因为自己调试的时候遇到了一个问题 xff0c 还是把堆栈溢出问题放到前面来说 增加临界区的使用说明 2021 11 7 临界区的使用部分增加任务挂起与临界区说明 2021 11
  • C++存储类

    存储类定义C 43 43 程序中变量 函数的范围 xff08 可见性 xff09 和生命周期 这些说明符放置在它们所修饰的类型之前 下面列出C 43 43 程序中可用的存储类 xff1a autoregisterstaticexternmu