C语言初始化效率问题以及关键字解释

news2025/2/26 6:56:12

一、初始化效率

1、在静态变量的初始化中,我们可以把可执行程序文件想要初始化的值放在当程序执行时变量将会使用的位置。当可执行文件载入到内存时,这个已经保存了正确初始值的位置将赋值给那个变量,完成这个任务并不需要额外的时间,也不需要额外的指令,变量将会得到正确的值、

2、自动变量当程序链接时还无法判断自动变量的存储位置。事实上,函数的局部变量在函数的每次调用中可能占据不同的位置。基于这个理由,自动变量没有缺省的初始值,而显示的初始化将在代码块的其实出插入一条隐式的赋值语句。

一句话总结;局部变量的初始化与分开写毫无区别

即什么时候使用变量什么时候声明,尽量重用,不要让他隐式初始化,浪费内存

static 关键字的修饰。

当它用于函数定义时,或用于代码块之外的变量声明时,static关键字用于修改标识符的链接属性,从external改为internal,但标识符的存储类型和作用域不受影响。用这种方式声明的函数或变量只能在声明他们的源文件中访问。

总结:

一下以文件解释

int a;

//a 变量存储在静态内存

特点:

在程序运行之前创建

可以被其他的C文件访问以及它的下方函数使用

初始化值为0

=================

static int a;

特点:在程序运行之前存在

静态内存存储

不能被其他文件访问

================

代码块中的变量

static int a ;

静态变量

与int a ;(局部变量)的区别是:

一个存储在静态内存 也就是普通内存

另一个是局部变量,也就是运行时堆栈

函数上添加static的话:

不能被其他的文件访问该函数

几个关键字的处理

static 静态内存

auto 运行时堆栈

register 硬件寄存器

external 引用外部文件变量函数

internal 引用内部文件变量函数

=======================

关于代码块变量被static修饰

保证该函数多次调用时,我们为了防止该变量不变

进行的处理比如我们进行了多次的调用

二、关键字解释

变量的存储类型(storage class )是指存储变量值的内存类型。变量的存储类型决定变量何时创建、何时销毁以及它的值将保持多久。有三个地方可以用于存储变量:普通内存、运行时堆栈、硬件寄存器。在这三个地方存储的变量具有不同的特性。

变量的缺省存储类型取决于它的声明位置。凡是在任何代码块之外声明的变量总是存储于静态内存中,也就是不属于堆栈的内存,这类变量成为静态变量。对于这类变量,你无法为他们制定其他存储类型。

静态变量在程序运行之前创建,在程序的整个执行期间始终存在。它始终保持原先的值,除非给它赋一个不同的值或者程序结束。

在代码块内部声明的变量的缺省存储类型是自动的(automatic),也就是说他存储于堆栈中,成为自动变量。有一个关键字auto就是用修饰这种存储类型的,但它极少使用,因为代码块中的变量在缺省情况下就是自动变量在程序执行到声明自动变量的代码块时,自动变量才被创建,当程序的执行流离开该代码时,这些自动变量便自行销毁。如果该代码块被数次执行,例如一个函数被反复调用,这些自动变量每次都将重新创建。在代码块再次执行时,这些自动变量在堆栈中所占据的内存位置有可能和原先的位置相同,也可能不同。及时他们所占据的位置相同,你也不能保证这块呢村同时不会有其他的用途,因此,我们可以说自动变量在代码块执行完毕后就消失。当代码块再次执行时,他们的值一般并不是上次执行时的值。

对于在代码块内部声明的变量,如果给它加上关键字static,可以使他的存储类型从自动变为静态。具有静态存储类型的变量在整个程序执行过程中一直存在,而不仅仅在声明它的代码块的执行时存在。注意,修改变量的存储类型并不标示修改该变量的作用域,它任然只能在该代码块内部按名字访问。

函数的形式参数不能声明后,关键字register可以用于自动变量的声明,提示他们应该存储于机器的硬件寄存器而不是内存中,这类变量称为寄存器变量。通常,寄存器变量比存储于内存的变量访问起来效率更高。

但是,编译器并不一定要理财register关键字,如果有太多的变量被声明为register,它只选取前几个实际存储于寄存器中,其余的就按普通自动比那辆处理。如果一个编译器自己具有一套寄存器优化方法,它可能忽略register关键字,使用:使用说明,为了加快程序的编译速度,你希望把使用频率高的那些变量声明为寄存器变量,在有些计算机中,如果你把指针声明为寄存器变量,程序的效率将能得到提高,有其是那些频繁的执行间接访问操作的指针,你可以把函数的形式参数声明为寄存器变量,编译器会在函数的起始位置生成指令,把这些值从堆栈复制到寄存器中。但是,完全有可能,这个优化措施所节省的时间和控件的开销还抵不上复制这几个值所用的开销。

寄存器变量的创建和销毁时间和自动变量相同,但它需要一些额外的工作。在一个使用寄存器变量的函数返回之前,这些寄存器先前存储的值必须恢复,确保调用者的寄存器变量未被破坏。许多机器使用运行时堆栈来完成这个任务。当函数开始执行时,它把需要使用的所有寄存器的内容都保存到堆栈中,当函数返回时,这些值再复制回寄存器中。在许多机器的硬件实现中,并不为寄存器指定的地址。同样由于寄存器值的保存和恢复某一个特定的寄存器在不同的时刻所保存的值不一定相同。基于这些理由,机器并不像你提供寄存器变量的地址。

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,

差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。(点击找小助理领取)

扫码进群领资料icon-default.png?t=N7T8https://s.pdb2.com/pages/20230519/16QijNiGb32IFIn.html

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

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

相关文章

Android 10.0 TvSettings系统设置wifi连接密码框点击Enter键失去焦点

1.前言 在10.0的box产品开发中,在TvSettings中,在wifi连接的时候,在用遥控器输入wifi密码框的时候,会发现在按遥控器Enter键的时候, 发现EditText焦点失去了,导致输入法消失了,为了解决这个问题就需要拦截Enter键保证正常输入wifi密码,接下来就来实现这个功能 如图: 2.…

lvs+keepalived+nginx双主模式双主热备实现负载均衡

目录 一、原理 二、真实服务器nginx配置 三、lvs的keepalived配置 3.1 配置文件 3.2 开启keepalived服务 四、测试 4.1 测试访问VIP 4.2 模拟lvs01宕机 主机名IPnginx0111.0.1.31nginx0111.0.1.31lvs0111.0.1.33lvs0211.0.1.34VIP111.0.1.29VIP211.0.1.30 一、原理 lvskeepal…

解决JuPyter500:Internal Server Error问题

目录 一、问题描述 二、问题原因 三、解决方法 四、参考文章 一、问题描述 在启动Anaconda Prompt后,通过cd到项目文件夹启动Jupyter NoteBook点击.ipynb文件发生500报错。 二、问题原因 base环境下输入指令: jupyter --version 发现jupyter环境…

k8s部署mongodb-sharded7.X集群(多副本集)

#mongodb-sharded 7.X版本CHART NAME: mongodb-sharded CHART VERSION: 7.0.5 APP VERSION: 7.0.2helm repo add bitnami https://charts.bitnami.com/bitnami helm pull bitnami/bitnami/mongodb-sharded --untar默认副本数较多。我修改为33 搜索关键字replicaCount 修改 最后…

064:vue中一维数组的全选、全不选、反选(图文示例)

第061个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…

【教程】通过Excel宏/Pandas两种方法来自动添加渐变数据条

这种数据真的很难看懂: 一般会对其画折线图或者数据条,相比起来就非常直观: 但是每一列都要手动这样设置就非常累了,所以这里就用到了VBA宏(或者Pandas)。 VBA宏方法 从这里进入宏: 随便写一个宏名后点创建&#xff1…

Triumphcore FPGA调测试记录

FPGA采用Xilinx pynq Z2开发板。基于V2.5版本开发 OverView uart端口映射 BUG调试记录 2024.1.7 复位状态导致取指时序错误 错误波形: 正确波形 问题代码: 2024.1.9 clock_wizard设置输入时钟是输出时钟的2^n倍,输出时钟的占空比才…

实战(CVE-2023-42442)JumpServer未授权访问漏洞

声明: 该文章仅供网络安全领域的学习使用,请勿利用文章内的相关技术从事任何非法行为。 知攻善防,遇强则强。 开发和安全缺一不可! 目录 一、知识介绍 1、堡垒机(跳板机) 2、Jumpserver 二、漏洞介绍 三…

本地远程实时获取无人机采集视频图像(天空端 + jetson nano + 检测分割 + 回传地面端显示)

1、无线图传设备介绍 2、jetson nano天空端数据采集检测保存 3、本地回传显示 1、无线图传设备介绍 由于本设计考虑将无人机得到检测结果实时回传给地面站显示,因此需要考虑一个远程无线通信设备进行传输。本设计采用思翼HM30图传设备。通过无线图传的wifi将天空端…

Linux——firewalld防火墙(二)

一、firewalld高级配置 1、IP地址伪装 地址伪装(masquerade):通过地址伪装,NAT设备将经过设备的包转发到指定接收方,同时将通过的数据包的源地址更改为其自己的接口地址。当返回的数据包到达时,会将目的地址修改为原始主机的地址…

HDFS相关API操作

文章目录 API文档环境配置API操作准备工作创建文件夹文件上传文件下载文件删除文件的更名和移动获取文件详细信息 API文档 HDFS API官方文档:https://hadoop.apache.org/docs/r3.3.1/api/index.html 环境配置 将Hadoop的Jar包解压到非中文路径(例如D:…

阿里云实时计算企业级状态存储引擎 Gemini 技术解读

本文整理自阿里云 Flink 存储引擎团队李晋忠,兰兆千,梅源关于阿里云实时计算企业级状态存储引擎 Gemini 的研究,内容主要分为以下五部分: 流计算状态访问的痛点企业级状态存储引擎GeminiGemini 性能评测&线上表现结语参考 一、…

手机直连卫星及NTN简介

一、手机直连卫星的发展现状 近日,华为推出了支持北斗卫星短报文的Mate 50旗舰机、P60系列,苹果也跟Globalstar(全球星)合作推出了支持卫星求救的iPhone14,最亮眼的还是华为的。这几款产品揭开了卫星通信探索消费领域…

JAVA基础学习笔记-day16-网络编程

JAVA基础学习笔记-day16-网络编程 1. 网络编程概述1.1 软件架构1.2 网络基础 2. 网络通信要素2.1 如何实现网络中的主机互相通信2.2 通信要素一:IP地址和域名2.2.1 IP地址2.2.2 域名 2.3 通信要素二:端口号2.4 通信要素三:网络通信协议 3. 谈…

点割集、边割集

点割集:对图G来说删去点割集的真子集,依旧连通。也就是说,点割集是删去使得图从连通变成非连通的最小节点的集合。 边割集:对图G来说删去边割集的真子集,依旧连通。也就是说,点割集是删去使得图从连通变成…

【小白专用】C# 连接 MySQL 数据库

C# – Mysql 数据库连接 1. 配置环境 #前提:电脑已安装Mysql服务; Visual Studio 安装Mysql依赖库: 工具 -> NuGet 包管理器 -> 管理解决方案的 NuGet程序包 —> 搜索, 安装Mysql.Data (Oracle); (安装成功后&…

建立四叉树[中等]

一、题目 给你一个n * n矩阵grid,矩阵由若干0和1组成。请你用四叉树表示该矩阵grid。你需要返回能表示矩阵grid的四叉树的根结点。四叉树数据结构中,每个内部节点只有四个子节点。此外,每个节点都有两个属性: 【1】val&#xff1…

阿里云c8i服务器CPU性能、架构及费用测评

阿里云第八代云服务器ECS计算型c8i实例,CPU采用Intel Xeon Emerald Rapids或者Intel Xeon Sapphire Rapids,主频不低于2.7 GHz,全核睿频3.2,阿里云百科aliyunbaike.com分享阿里云c8i服务器CPU处理器型号、存储、网络、安全、使用场…

网络协议与攻击模拟_03实施ARP欺骗和攻击

一、ARP攻击 1、实验环境 kali Linux (安装arpspoof工具)被攻击主机 2、kali配置 kali Linux系统是基于debian Linux系统,采用deb包管理方式,可以使用apt源的方式进行直接从源的安装。 配置kali网络源 vim /etc/apt/sources…

(树木/道路/建筑)点云实验数据,包括pcd,ply,las,txt格式

(树木/道路/建筑)点云实验数据,包括pcd,ply,las,txt格式 一、介绍1.下载(百度网盘) 一、介绍 因为一直有朋友问数据,其实有很多的公开数据集可以使用,可能刚开始学习不习惯找吧,所以…