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

一、初始化效率

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自动化的运维管理:探究Kubernetes工作机制的奥秘

1 云计算时代的操作系统 Kubernetes 是一个生产级别的 容器编排平台 和 集群管理系统 ,能够 创建、调度容器,监控、管理服务器。 容器是什么?容器是软件,是应用,是进程。服务器是什么?服务器是硬件&#…

CMake入门教程【高级篇】管理MSVC编译器警告

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1.什么是MSVC?2.常用的屏蔽警告3.MSVC所有警告4.target_compile_options用法5.如何在CMake中消除MSVC的警告?6.屏蔽警告编写技巧

一台Linux服务jdk1.6 与 jdk1.8 并存,tomcat6+tomcat8 并存

Linux jdk1.6,1.8 tomcat6 tomcat8 并存 需求场景: 有一个项目 原来是 jdk1.6tomcat6 部署的,现在需要进行项目架构升级 项目需要适配jdk1.8 然后用 jdk.8 tomcat 8进行部署,然后下架 jdk1.6 的linux服务 现在有一台 jdk.8 tomcat 8的linu…

100V耐压 LED恒流驱动芯片 SL2516D兼容替换LN2516车灯照明芯片

SL2516D LED恒流驱动芯片是一款专为LED照明设计的高效、高精度恒流驱动芯片。与LN2516车灯照明芯片兼容,可直接替换LN2516芯片,为LED车灯照明提供稳定、可靠的电源解决方案。 一、SL2516D LED恒流驱动芯片的特点 1. 高效率:SL2516D采用先进的…

C#,字符串匹配(模式搜索)KMP算法的源代码与数据可视化

D.E.Knuth J.H.Morris 一、KMP算法 KMP 算法(Knuth-Morris-Pratt 算法)是其中一个著名的、传统的字符串匹配算法,效率比较高。 KMP算法由D.E.Knuth,J.H.Morris和V.R.Pratt在 Brute-Force算法的基础上提出的模式匹配的改进算法。…

C# 使用Fleck创建WebSocket服务器

目录 写在前面 代码实现 服务端代码 客户端代码 调用示例 写在前面 Fleck 是 C# 实现的 WebSocket 服务器,通过 WebSocket API,浏览器和服务器只需要做一个握手的动作,然后浏览器和服务器之间就形成了一条快速通道;两者之间…

ubuntu 18.04网络问题

ubuntu 18.04网络问题汇总 准备工作一、有线网卡不可用二、无法访问外网 准备工作 安装好系统之后,检查gcc和make是否已经安装 $ which gcc /usr/bin/gcc $ which make /usr/bin/make如果未安装,则安装gcc和make $ apt install gcc $ apt install mak…

内网渗透实战攻略

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:"没有罗马,那就自己创造罗马~" 目录 介绍 什么是内网? 什么是内网渗透? 内网渗透的目的: 内网…

STS里的java 工程项目名称修改和目录设置成源代码

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/n…

实现导航栏吸顶操作

一、使用VueUse插件 // 安装 npm i vueuse/core二、点击搜索useScroll 2.1搜索结果如图 三、使用 // 这是示例代码 import { useScroll } from vueuse/core const el ref<HTMLElement | null>(null) const { x, y, isScrolling, arrivedState, directions } useSc…

探索生成式AI:自动化、问题解决与创新力

目录 自动化和效率&#xff1a;生成式AI的颠覆力量 解谜大师生成式AI&#xff1a;如何理解和解决问题 创新与创造力的启迪&#xff1a;生成式AI的无限潜能 自动化和效率&#xff1a;生成式AI的颠覆力量 1. 神奇的代码生成器&#xff1a;生成式AI可以帮助开发人员像魔术一样快…

使用PAI-DSW搭建基于LangChain的检索知识库问答机器人

教程简述 在本教程中&#xff0c;您将学习如何在阿里云交互式建模&#xff08;PAI-DSW&#xff09;中&#xff0c;基于LangChain的检索知识库实现知识问答。旨在建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。 LangChain是一个开源的框架&#xff0c…

模型参数访问

文章目录 前言某一层的参数目标参数一次性访问所有参数嵌套块收集参数 前言 在选择了架构并设置了超参数后&#xff0c;进入训练阶段。此时&#xff0c;我们的目标就是找到使损失函数最小化的模型参数。有时&#xff0c;我们希望提取参数&#xff0c;以便在其他环境中复用。 …

《华夏教师》是什么级别的期刊?是正规期刊吗?能评职称吗?

《华夏教师》杂志对象主要面向中小学校长和各级教育界管理者&#xff0c;旨在为教育工作者和管理者提供国内外最新、最前沿的教育动态&#xff0c;剖析教育教学热点问题&#xff0c;展现学校教师风采而服务。 收录情况&#xff1a;知网万方维普收录 投稿方式&#xff1a;教育类…

彭博评选2024年50家企业,比亚迪、联发科上榜 | 百能云芯

彭博资讯于9日发布2024年全球50家值得关注的企业名单&#xff0c;该名单由彭博分析师团队从金融到食品等领域追踪了约2,000家企业中挑选出的&#xff0c;根据「观点聚焦」清单&#xff0c;选出50家值得关注的公司&#xff0c;重点考虑了其独特观点、领导层变化、资产出售或并购…

评估LLM在细胞数据上的实用性(1)-基本概述

基于LLM的基础模型在工业和科学领域都取得了重大进展。本报告通过八个与单细胞数据相关的下游任务的综合实验&#xff0c;评估了LLM在单细胞测序数据分析中的性能。通过将七种不同的单细胞LLM与特定任务下的baselines进行比较&#xff0c;结果发现单细胞LLMs在所有任务中可能并…

Istio 实战:WasmPlugin(Proxy-Wasm 插件)开发(实现限流和修改请求和响应的 header)

WasmPlugin 的典型应用 限流&#xff1a;当前 envoy 提供的限流能力虽然比较强大&#xff0c;但主要提供了一些 api&#xff0c;在使用上对用户不够友好&#xff0c;且全局限流对每个请求都调用一次限流服务&#xff0c;性能损耗较大。因此&#xff0c;可以通过开发限流过滤器…

linux 压力测试 AB ApacheBench

ab的简介 ab是apachebench命令的缩写。 ab是apache自带的压力测试工具。ab非常实用&#xff0c;它不仅可以对apache服务器进行网站访问压力测试&#xff0c;也可以对或其它类型的服务器进行压力测试。比如nginx、tomcat、IIS等 ab的原理 ab的原理&#xff1a;ab命令会创建多…

order by之后的injection(sqllabs第四十六关)

order by相关注入知识 这一关的sql语句是利用的order by 根据输入的id不同数据排序不一样可以确定就是order by order by后面无法使用ubion注入&#xff08;靠找不到&#xff09; 可以利用后面的参数进行攻击 1&#xff09;数字 没作用考虑布尔类型 rand和select ***都可以 …

xss-labs(10-16)

level10:欢迎来到level10 尝试注入 <script>alert(欢迎来钓鱼)</script> 寻找注入点 让表单显示出来 随便输入一个字符康康 url出现了变化</