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

P14 C++局部静态变量static延长生命周期

目录

01 前言

02 变量的作用域与生命周期

 2.1 什么是作用域:

2.2 什么是变量的生命周期:

03 局部静态

3.1非静态变量例子

3.2静态变量例子

04 全局变量

05 后话 


01 前言

在前几期里,我们了解了static关键字在特定上下文中的含义。

今天我们看一看另一个环境。我们可以在局部作用域中使用 static 来声明一个变量。

这种情况和我们之前看到的两种static有点不同。这次的局部静态 Local static 有更多的含义。

02 变量的作用域与生命周期

正式开始之前我们先了解什么是作用域和生命周期

 2.1 什么是作用域:

一段程序代码中所用到的名字并不总是有效或者可用,而限定这个名字可用性的代码范围就是这个名字的作用域。

  1. 局部变量的作用域是变量所在的局部范围。
  2. 全局变量的作用域是整个工程。

2.2 什么是变量的生命周期:

变量的创建到变量的销毁之间的一个时间段。

  1. 局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束。
  2. 全局变量的生命周期:整个程序的生命周期。

03 局部静态

局部 local static 变量允许我们声明一个变量,它的生命周期基本上相当于整个程序的生命周期,然而它的作用范围却被限制在这个函数内。

在任何作用域中声明它都可以,这个和函数没有关系,刚才我只是用函数举了一个例子,它并不仅仅局限在函数内部,也可以在 if 语句中,可以在任何位置。

这就是为什么函数作用域中的 static 和类作用域中的 static之间没有太大区别的原因,因为生命周期实际是相同的。唯一的区别是在类作用域中,类中的任何东西都可以访问它(这个静态变量)。

如果你在函数作用域中声明一个静态变量,它将是那个函数的局部变量。对类来说也是局部变量。

让我们来看一些例子。

3.1非静态变量例子

#include <iostream>void funtion()
{int i = 0;i++;std::cout << i << std::endl;
}int main()
{funtion();funtion();funtion();funtion();funtion();return 0;
}

 我们创建了个函数funtion,内部定义int i = 0;然后让它自加1,cout函数将结果打印出来

 

可以看到每一次调用这个函数时 i 都会被设置为 0。然后增加 1,通过调用函数来进行测试。

你可以看到1被打印了5次。

3.2静态变量例子

但是如果我给变量i 设置为static静态变量的话。

#include <iostream>void funtion()
{static int i = 0;i++;std::cout << i << std::endl;
}

由运行结果分析,当static修饰局部变量i后,变量i在funtion函数中进入后创建,出函数并未后销毁,而是保留了上一次循环i出funtion函数后的值继续作用,即局部变量i被static关键字修饰后,作用域不变,生命周期变长了。 

这意味着当我第一次调用函数时,这个变量将被初始化为 0。然后所有对函数的后续调用实际上不会创建另一个全新的变量,而是将第一次初始化的变量i的生命周期延长了

04 全局变量

比如我创建一个全局变量b

#include <iostream>int b = 0;void funtion()
{//static int i = 0;b++;std::cout << b << std::endl;
}int main()
{funtion();funtion();funtion();b = 10;funtion();funtion();return 0;
}

这样的写法没有任何问题。但是我们可以在任何地方访问 b。比如你可以在 function 函数调用之间让 b 等于 10。这可以极大的改变你的程序所做的事情。

所以如果你想要这样做,但又不希望让每个人都能访问这个变量。你可以在局部作用域下声明成 static。像我一开始写的程序那样。

05 后话 

最后,我们要记住

  1. 局部 local static 变量允许我们声明一个变量,它的生命周期基本上相当于整个程序的生命周期,然而它的作用范围却被限制在这个函数内。
  2. 在任何作用域中声明它都可以,这个和函数没有关系,刚才我只是用函数举了一个例子,它并不仅仅局限在函数内部,也可以在 if 语句中,可以在任何位置

相关文章:

P14 C++局部静态变量static延长生命周期

目录 01 前言 02 变量的作用域与生命周期 2.1 什么是作用域&#xff1a; 2.2 什么是变量的生命周期&#xff1a; 03 局部静态 3.1非静态变量例子 3.2静态变量例子 04 全局变量 05 后话 01 前言 在前几期里&#xff0c;我们了解了static关键字在特定上下文中的含义。 …...

C语言:写一个函数,求字符串的长度,在main函数中输入字符串并输出其长度(指针)

分析&#xff1a; 在程序中&#xff0c;定义一个函数 fix&#xff0c;该函数使用指针变量来访问字符串中的每个字符&#xff0c;并计算出字符串的长度。fix 函数的参数为指向 char 类型的指针变量 p&#xff0c;表示需要计算长度的字符串。 在主函数 main 中&#xff0c;定义一…...

CentOS7安装Docker运行环境

1 引言 Docker 是一个用于开发&#xff0c;交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开&#xff0c;从而可以快速交付软件。借助 Docker&#xff0c;您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付&#xff0c;…...

单片机调试技巧--栈回溯

在启动文件中修改 IMPORT rt_hw_hard_fault_exceptionEXPORT HardFault_Handler HardFault_Handler PROC; get current contextTST lr, #0x04 ; if(!EXC_RETURN[2])ITE EQMRSEQ r0, msp ; [2]0 > Z1, get fault context from h…...

分布式锁之基于redis实现分布式锁(二)

2. 基于redis实现分布式锁 2.1. 基本实现 借助于redis中的命令setnx(key, value)&#xff0c;key不存在就新增&#xff0c;存在就什么都不做。同时有多个客户端发送setnx命令&#xff0c;只有一个客户端可以成功&#xff0c;返回1&#xff08;true&#xff09;&#xff1b;其他…...

python中%s的用法(字符串变量赋值办法),长字符串换行办法

参考&#xff1a; http://wap.mobiletrain.org/about/BBS/142752.html https://blog.csdn.net/PolarisRisingWar/article/details/131134627 https://baijiahao.baidu.com/s?id1756094563884490493&wfrspider&forpc 字符串变量赋值 "Hello, %s. Today is %s.&q…...

【Mybatis】预编译/即时sql 数据库连接池

回顾 Mybatis是一个持久层框架.有两种方式(这两种方式可以共存) 1.注解 2.xml 一.传递参数 以使用#{} 来接受参数为例 (以上两种方式一样适用的) 1)传递单个参数 #{} 可以为任意名称 2)多个参数 默认的参数名称就是接口方法声明的形参 3)参数为对象 默认给每个对象的每个属性都…...

物联网AI 无线连接学习之WiFi基础篇 802.11协议发展

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 前言 随着物联网行业不断发展&#xff0c;WiFi技术的发展在其中起着非常关键的作用&#xff0c;也是我们日常生活中使用非常广泛的无线网络技术之一&#xff0c;现在我们随便买一个家用电子产品&#xff0c…...

FreeRTOS-队列Queue

队列Queue 队列Queue可以用在“任务到任务”、“任务到中断”、“中断到任务”直接传输信息。 队列的阻塞访问&#xff08;可指定超时时间&#xff09; 只要知道队列的句柄&#xff0c;任务、ISR都可以读、写该队列。任务读写队列时&#xff0c;如果读写成功了就马上进入就绪态…...

车内总线通信技术简述

1. 前言 本文主要分享一些汽车总线通信技术&#xff08;CAN、CANFD、LIN、Flex Ray、MOST、LVDS、TTP/C、Ethernet&#xff09;&#xff0c;希望对大家能有所帮助。 2. 多种汽车总线通信技术 2.1 CAN CAN&#xff08;Controller Area Network&#xff09;全称为“控制器局域…...

6.2 Windows驱动开发:内核枚举SSSDT表基址

在Windows内核中&#xff0c;SSSDT&#xff08;System Service Shadow Descriptor Table&#xff09;是SSDT&#xff08;System Service Descriptor Table&#xff09;的一种变种&#xff0c;其主要用途是提供Windows系统对系统服务调用的阴影拷贝。SSSDT表存储了系统调用的函数…...

实时LCM的ImgPilot搭建部署

ImgPilot是具有实时潜在一致性模型&#xff08;LCM&#xff09;功能的图像试点 下载源码 GitHub - leptonai/imgpilot: Image pilot with the power of Real-Time Latent Consistency Modelhttps://github.com/leptonai/imgpilot安装前端web cd imgpilot npm install 安装…...

开源与闭源:大模型未来的发展之争

在当今数字化时代&#xff0c;开源与闭源软件一直是技术界争论的热点话题。随着人工智能技术的快速发展&#xff0c;特别是大模型&#xff08;如GPT-4等&#xff09;的广泛应用&#xff0c;这个辩论在大模型技术的背景下变得更加引人注目。本文将探讨开源与闭源的优劣势比较&am…...

linux系统初始化本地git,创建ssh-key

step1, 在linux系统配置你的git信息 sudo apt install -y git//step1 git config --global user.name your_name // github官网注册的用户名 git config --global user.email your_email //gitub官网注册绑定的邮箱 git config --list //可以查看刚才你的配置内容…...

JDBC 操作 SQL Server 时如何传入列表参数

本文是作为将要对 PostgreSQL 的 in, any() 操作的一个铺垫&#xff0c;也是对先前用 JDBC 操作 SQL Server 的温习。以此记录一下用 JDBC 查询 SQL Server 时如何传递一个列表参数。比如想像一下查询语句 select * from users where id in (?) 我们是否能给这里的问题参数传递…...

[算法总结] - 蓄水池采样算法

问题描述 在长度为N的数组中&#xff0c;随机等概率选取K个元素&#xff0c;如何实现这个随机算法。 思路很简单&#xff0c;生成一个[0, N]的随机数index&#xff0c;然后返回index上的数值即可。 但是&#xff0c;如果输入是一个长度未知的数组比如stream&#xff0c;先遍历…...

【Dockerfile】将自己的项目构建成镜像部署运行

目录 1.Dockerfile 2.镜像结构 3.Dockerfile语法 4.构建Java项目 5.基于Java8构建项目 1.Dockerfile 常见的镜像在DockerHub就能找到&#xff0c;但是我们自己写的项目就必须自己构建镜像了。 而要自定义镜像&#xff0c;就必须先了解镜像的结构才行。 2.镜像结构 镜…...

flink和机器学习模型的常用组合方式

背景 flink是一个低延迟高吞吐的系统&#xff0c;每秒处理的数据量高达数百万&#xff0c;而机器模型一般比较笨重&#xff0c;虽然功能强大&#xff0c;但是qps一般都比较低&#xff0c;日常工作中&#xff0c;我们一般是如何把flink和机器学习模型组合起来一起使用呢? fli…...

自动驾驶学习笔记(十二)——定位技术

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 卫星定位 RTK定位 IMU定位 GNSS定…...

【MySQL系列】PolarDB入门使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

别再死记硬背了!用sklearn的LogisticRegression搞定手写数字识别,附完整代码与参数调优心得

逻辑回归实战&#xff1a;从参数困惑到手写数字识别调优指南 当你第一次面对sklearn的LogisticRegression那十几个参数时&#xff0c;是否感到无从下手&#xff1f;特别是当官方文档用专业术语解释solver、C、max_iter时&#xff0c;大多数教程只会告诉你"照这样设置就行&…...

httpspider全局抓包,直接抓取下载模拟器 手机 平板 电视中的数据(视频 音乐 直播

httpspider可以抓取所有经过电脑的所有http和https数据&#xff0c;比如 抓取安卓模拟器&#xff0c;其他电脑软件&#xff0c;而且还可以直接抓取手机中的流量。先看效果图抓模拟器&#xff1a;抓手机&#xff1a;分享了「httpspider.exe」 链接&#xff1a;https://pan.quark…...

Qwen3-VL:30B在嵌入式系统的轻量化部署方案

Qwen3-VL:30B在嵌入式系统的轻量化部署方案 将30B参数的多模态大模型塞进嵌入式设备&#xff1f;这听起来像是天方夜谭&#xff0c;但通过巧妙的轻量化技术&#xff0c;我们确实能让Qwen3-VL在资源受限的环境中运行起来。 1. 为什么要在嵌入式系统部署大模型&#xff1f; 你可…...

Go反射reflect包高级用法

Go语言反射机制探秘&#xff1a;深入reflect包高级用法 Go语言的反射机制通过reflect包为开发者提供了强大的运行时类型检查与操作能力。尽管反射会带来一定的性能开销&#xff0c;但在需要动态处理类型、实现泛型逻辑或构建框架时&#xff0c;它往往是不可替代的工具。本文将…...

StructBERT中文相似度模型实操手册:如何扩展为‘单句vs百句’本地向量检索服务

StructBERT中文相似度模型实操手册&#xff1a;如何扩展为‘单句vs百句’本地向量检索服务 1. 项目简介与核心价值 StructBERT中文相似度模型是基于阿里达摩院开源的大规模预训练模型开发的本地化语义匹配工具。这个工具能够将中文句子转化为高质量的特征向量&#xff0c;通过…...

HybridCLR的底层原理

HybridCLR&#xff08;原名huatuo&#xff09;是一个为Unity IL2CPP后端设计的原生C#热更新解决方案。它通过扩展Unity的IL2CPP运行时&#xff0c;将其从纯AOT&#xff08;提前编译&#xff09;模式改造为 “AOT 解释器”混合运行时&#xff0c;从而原生支持动态加载.NET程序集…...

Cloudflare防火墙实战:5个高效规则提升网站安全与性能

1. Cloudflare防火墙&#xff1a;你的网站安全第一道防线 第一次接触Cloudflare防火墙时&#xff0c;我完全被它强大的功能震撼到了。作为一个免费工具&#xff0c;它能拦截90%以上的恶意流量&#xff0c;这简直是小站长的福音。记得去年我的个人博客突然遭遇一波CC攻击&#x…...

OpenClaw日志分析技能:千问3.5-27B自动排查错误信息

OpenClaw日志分析技能&#xff1a;千问3.5-27B自动排查错误信息 1. 为什么需要自动化日志分析 作为一名长期与代码打交道的开发者&#xff0c;我每天至少有30%的时间花在查看日志上。从服务器报错到应用崩溃&#xff0c;从性能瓶颈到数据异常&#xff0c;日志就像系统的"…...

保姆级教程:用Python脚本一键划分LS-SSDD-v1.0数据集(附近岸/离岸测试集处理)

Python自动化处理LS-SSDD数据集&#xff1a;从混乱到规范的完整指南 当你第一次打开LS-SSDD-v1.0数据集时&#xff0c;面对24,00016,000像素的大图和9000张800800的小图&#xff0c;以及各种划分文件&#xff0c;可能会感到无从下手。这份数据集虽然为SAR图像中的小舰船检测提供…...

语音转文字神器!Speech Seaco Paraformer WebUI详细使用指南

语音转文字神器&#xff01;Speech Seaco Paraformer WebUI详细使用指南 1. 为什么你需要这个语音识别工具 在日常工作和学习中&#xff0c;我们经常遇到需要将语音内容转换为文字的场景。无论是会议记录、采访整理&#xff0c;还是视频字幕制作&#xff0c;传统的手动听写方…...