C++中static初始化一次的真实含义

news/2024/11/30 20:38:35/文章来源:https://www.cnblogs.com/chentiao/p/18578838

1. static 变量的初始化与赋值

static 变量在 C++ 中有一个特别的性质:它们在程序的生命周期内只会被初始化一次,但之后可以继续对其进行赋值。

  • 初始化static 变量在程序的初始化阶段(即程序第一次执行时)会被初始化一次。如果是局部 static 变量,则它会在第一次执行到该变量所在的代码行时被初始化;如果是全局或静态作用域内的变量,则会在程序启动时初始化。

  • 赋值:初始化之后,static 变量的值是可以改变的。赋值操作不会改变 static 变量的内存地址,也就是说,static 变量的内存地址在整个程序运行期间是固定的。赋值只会改变该内存地址中存储的数据,而不会影响变量的地址。

示例:static 变量的初始化和赋值

#include <iostream>void testStatic() {static int x = 10;  // 初始化只发生一次std::cout << "x = " << x << std::endl;x = 20;  // 赋值,但不重新初始化std::cout << "x after assignment = " << x << std::endl;
}int main() {testStatic();  // 第一次调用,初始化并赋值为 10testStatic();  // 第二次调用,x 已初始化,赋值为 20return 0;
}

输出:

x = 10
x after assignment = 20
x = 20
x after assignment = 20

在这个例子中,x 是 static 变量:

  • 第一次调用 testStatic() 时,x 会被初始化为 10,之后赋值为 20。
  • 第二次调用 testStatic() 时,x 不会重新初始化,而是保持上次赋的值(20),并可以继续赋值。

内存地址不变:无论你如何对 x 进行赋值,x 的内存地址始终不变,它依然指向同一块内存位置。

2. 普通变量的初始化与赋值

对于普通的局部变量,每次进入其作用域时,该变量会被重新初始化,并且会在栈上分配新的内存空间。普通变量 可以多次初始化,但每次进入作用域时,都会重新为该变量分配内存(除非它是动态分配的,如使用 new)。

  • 初始化:每次进入作用域时,局部变量都会被重新初始化,并且会重新分配栈空间。
  • 赋值:可以在初始化之后对普通变量进行赋值,但赋值不等于初始化。赋值操作会改变该变量存储的值,而不会影响它的内存位置(除非你是指针类型)。

示例:普通局部变量的初始化和赋值

#include <iostream>void testNormal() {int x = 10;  // 每次进入函数时都会初始化std::cout << "x = " << x << std::endl;x = 20;  // 赋值,但内存地址不变std::cout << "x after assignment = " << x << std::endl;
}int main() {testNormal();  // 第一次调用,初始化为 10testNormal();  // 第二次调用,重新初始化为 10return 0;
}

输出:

x = 10
x after assignment = 20
x = 10
x after assignment = 20

在这个例子中,x 是普通的局部变量:

  • 每次调用 testNormal() 时x 会被重新初始化,并且会重新分配栈空间。
  • x 的值在初始化后可以被赋值为其他值,但它的内存地址在每次调用 testNormal() 时都是新的,栈空间会被重新分配。

3. 对比:static 变量与普通变量的差异

特性static 变量普通局部变量
初始化 只初始化一次,在程序启动或首次调用时初始化 每次进入作用域时初始化
赋值 之后可以多次赋值,但不改变内存地址 可以多次赋值,但内存地址随每次进入作用域不同
内存管理 只有一块内存空间,内存地址固定 每次进入作用域时会重新分配内存
生命周期 整个程序运行期间(从程序启动到结束) 仅在作用域内有效,出作用域时销毁

4. 栈空间与堆空间的对比(内存分配)

  • 栈空间(stack):局部变量(普通变量)通常存储在栈上。每次进入作用域时,栈空间会为变量分配内存,离开作用域时销毁。这是 自动内存管理

  • 堆空间(heap):使用 new 或 malloc 分配的内存则来自堆。堆上的内存通常需要显式释放(如通过 delete 或 free),否则会导致内存泄漏。

5. 结论

  • static 变量:初始化只发生一次,内存地址在整个程序的生命周期内固定,不会发生变化。之后的赋值只是改变其存储的值,而不会改变内存地址。
  • 普通局部变量:每次进入作用域时会重新分配内存,并且会重新初始化。因此,每次函数调用时,局部变量的内存空间是不同的。

总结来说,static 变量不会在每次调用时重新分配内存,它的内存地址是固定的,而普通局部变量每次进入作用域时都会重新分配内存,内存地址不同。

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

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

相关文章

《网络与系统攻防技术》实验七

1.实验内容及要求 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法。具体实践有 (1)简单应用SET工具建立冒名网站 (2)ettercap DNS spoof (3)结合应用两种技术,用DNS spoof引导特定访问到冒名网站。 二、实验过程 (一)简单应用SET工具建…

HCIP-04 交换高级技术

VLAN聚合通过配置Super-VLAN和Sub-VLAN,不同Sub-VLAN之间进行通信,需要Super-VLAN开启ARP代理。 VLAN聚合既避免了由于子网划分带来的网络地址规划复杂的问题,又能够实现通过VLAN隔离不同广播域的目的。 • MUX VLAN包括Principal VLAN和Subordinate VLAN,同时Subordinate …

基于Jenkins构建微服务发布平台-2

基于Jenkins构建微服务发布平台-2 续——基于Jenkins构建微服务发布平台-1 4 流水线自动发布微服务项目 4.4 Docker阿里云镜像加速失效解决方案 在所有节点上执行。# tee /etc/docker/daemon.json <<-EOF{ "registry-mirrors": [ "https://do.nar…

九种常见二维插值方法及双线性插值的理解

九种常见二维插值方法概述 在数据分析、计算机视觉和图形处理等领域,插值是一种重要的技术,用于估算在已知数据点之间的未知值。以下是几种常用的插值方法的详细介绍。 1. 双线性插值 (Bilinear Interpolation) 双线性插值是一种在二维直线网格上进行插值的技术。它首先在一个…

c# is 和 as 浅看重制版

前言 当年写的比较差:https://www.cnblogs.com/aoximin/p/12965408.html,所以特来重新写一遍。 正文 首先为什么会出现is 和 as 呢? 因为是为了有需要检验的地方,如果直接使用显示转换的话,那么可能直接报错了。 namespace ConsoleApp4 {class Program{static void Main(s…

20222422 2024-2025-1 《网络与系统攻防技术》实验五实验报告

一、实验内容 (1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息: DNS注册人及联系方式 该域名对应IP地址 IP地址注册人及联系方式 IP地址所在国家、城市和具体地理位置 PS:使用whois、dig、nslookup、traceroute、以及各类在线和离线…

安装扫描仪DS-410出现安装Desktop Experience提示

安装Epson Scan所需的某些模块没有安装。安装Desktop Experience之后安装Epson Scan。在Windows server 2012上安装扫描仪出现该错误,该错误为server系统需要桌面支持,默认Windows server 该功能是不安装的需要用户按需求安装。 安装windows server 2012 R2 安装桌面体验勾选…

2019-8-29-02-JS-DOM

图片轮播是Web开发中最常见的组件之一,这是一篇用原生JavaScript实现简单图片轮播的教程。 要实现图片轮播,首先我们要将图片轮播拆分为图片容器、图片、上一页按钮、下一页按钮、底部点选容器、底部点选按钮。 下面我们用HTML代码表示。 ... <div id="page">…

【朝花夕拾】蓝牙WiFi常识篇

一、蓝牙常识点 1、常见英文缩写缩写 英文全称 释义BLE Bluetooth Low Energy低功耗蓝牙BR Basic Rate基本速率,一般说的经典蓝牙就是指BR/EDREDR Enhanced Data Rate增强速率,BR的增强版,一般说的经典蓝牙就是指BR/EDRBluetooth SIG Bluetooth Special Interest Group蓝牙技…

Git入门图文教程(1.5W字40图)--深入浅出、图文并茂

原文:Git入门图文教程(1.5W字40图)🔥🔥--深入浅出、图文并茂 - 安木夕 - 博客园01、认识一下Git!—简介 Git是当前最先进、最主流的分布式版本控制系统,免费、开源!核心能力就是版本控制。再具体一点,就是面向代码文件的版本控制,代码的任何修改历史都会被记录管理起…

20222414 2024-2025-1 《网络与系统攻防技术》实验七实验报告

1.实验内容及要求 1.1本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法。具体实践有 (1)简单应用SET工具建立冒名网站 (2)ettercap DNS spoof (3)结合应用两种技术,用DNS spoof引导特定访问到冒名网站。 1.2本周学习内容 (1)web安全基础:…

硬盘的基本知识与选购指南

1、3.5和2.5英寸硬盘的英寸,不是指外壳的尺寸,而是硬盘盘片的直径尺寸。 无论是 2.5英寸的硬盘还是 3.5 英寸的硬盘,都是使用 SATA 接口。 1.1、3.5英寸 3.5 英寸的硬盘在 1984 年就已经诞生,直到在 1991 年出现首款容量为 1GB 的机械硬盘,3.5 英寸硬盘开始成为标准规格。…