内外部函数和内存模型

news2024/9/21 4:37:27

1、函数(封装、复用)

功能性:最基本的特性;
扩展性:对于时刻变化的需求易于扩展;
维护性:对于时刻变化的需求易于维护,易于编码变更;
封装性:不要把所有的代码都写到一个文件或者一个函数里边去 模块 函数;
可读性:写的代码让人容易理解,要求足够的注释、结构清晰、多使用宏定义、枚举类型等。

1.1、函数的实际参数与形式参数

函数参数分为形参和实参两种,作用是实现数据传送。
形参出现在函数定义中,只能在该函数体内使用。发生函数调用时,调用函数把实参的值复制1份,传送给被调用函数的形参,从而实现调用函数向被调用函数向被调用函数的数据传送。

1.2、数组作为函数参数

为什么C语言创造者在设计函数时,当数组作为实际参数的时候,函数的形式参数会默认退化为指针类型?
如果传的是整个数组,调用又会开辟空间,栈内存会耗费非常快。作为指针会节省内存空间,地址或者指针只占用有限的内存空间(一般32位机器上只占用4个字节,64位机器上所有的指针类型占用空间,都是8字节)
传数组的时候没有必要完全复制实际参数,是需要将数组的首地址或者指针传入即可。因为数组的其他元素,可通过首地址+偏移找到,所以也要传递数组的大小。

1.3、函数的递归调用

企业编码规范中,一般要求尽量避免使用递归!

1.4、内部变量与外部变量

C语言中所有的变量都有自己的作用域。变量说明的位置不同,其作用域也不同,据此将C语言中的变量分为内部变量和外部变量。

在一个函数内部说明的变量是内部变量,它只在该函数范围内有效。也就是说,只有在包含变量说明的函数内部,才能使用被说明的变量,在此函数之外就不能使用这些变量了。所以内部变量也称“局部变量”。

关于局部变量的作用域还要说明以下几点:
1、主函数main()中定义的内部变量,也只能在主函数中使用,其他函数不能使用。同时,主函数中也不能使用其他函数中定义的内部变量。因为主函数也是一个函数,与其他函数是平行关系。这一点是与其他语言不同的,应予注意。
2、形参变量也是内部变量,属于被调用函数;实参变量,则是调用函数的内部变量。
3、允许在不同的函数中使用相同的函数名,它们代表的对象,分配不同的单元,互不干扰,也不会发生混淆。
4、在复合语句中也可定义变量,其作用域只在复合语句范围内。

尽量少使用全局变量,即使使用了全局变量也进行把它封装起来!
全局变量多了,维护性差!全局变量作用域是整个程序,谁都可以改!

1.5、extern关键字的使用

总结:
1、头文件一般是做外部变量以及外部函数声明用的,如果本文件的一些变量或者函数想给“别人”用的话,就 需要将这些变量或者函数声明到其对应的头文件中。
2、头文件中不建议定义变量!(容易产生变量重定义的错误)
3、变量的声明和定义之间的区别:
变量的定义是需要给变量分配内存空间的,并且可以初始化;
变量的声明是告诉编译器,我有这个变量存在,并不给变量分配内存空间,因此也就不能在声明的时候进行初始化赋值等操作。

1.6、外部函数与内部函数

变量的声明和定义的区别:
声明不分配内存空间,变量定义分配内存空间。

变量定义在头文件中好不好?
首先,编码规范规定,变量的定义一定放在源文件中,声明在头文件。

防止头文件重复包含,应该怎么做?(头文件使用#ifndef #define #endif作用 )
头文件展开多次,变量会多次定义。

2、实践案例

3、内存模型(memory layout)

3.1、内存类型的划分

Stack 栈区(非staic的局部变量,函数参数)声明周期是局部变量定义开始到函数结束。
Heap 堆区(malloc,calloc,realloc等动态分配的内存)声明周期是从malloc动态开辟空间开始,到调用free结束。
静态全局变量(静态变量,全局变量,常量)声明周期是从静态变量,全局变量,常量定义开始,到程序结束。(.bss .data .rodata)
代码区(存放函数体的二进制代码)用于存储程序编译连接后生成的二进制机器码指令的内存区域只读不可以更改。(.text)

在这里插入图片描述其中text表示只读区(.text和.rodata),data为.data初始化的全局变量或静态变量,.bss表示未初始化全局变量或静态变量。dec为前三者的和,hex为dec列的16进制表示。

3.2、RAM和ROM,Flash Memory的物理特性y

RAM又称随机存取器,存储的内容可通过指令随机读写访问。RAM中的存储的数据在掉电是会丢失,因而只能在开机运行时存储数据。其中RAM又可以分为两种,一种时Dynamic RAM(DRAM 动态随机存储器),另一种是Static RAM(SRAM,静态随机存储器)。

ROM又称只读存储器,只能从里面读出数据而不能任意写入数据。具有掉电后数据可保持不变的优点。因此常用存放一次性写入的程序和数据,比如主板的BIOS程序就是ROM存储器。

Flash Memory 由于ROM具有不易更改的特性,后面就发展了Flash Memory。Flash Memory不仅具有ROM掉电不丢失数据的特点,又可以在需要的时候对数据进行更改,不过价格比ROM高。

不同数据的存放位置:
由前面的分析我们知道,代码区和常量区的内容是不允许被修改的,ROM(STM32就是Flash Memory)也是不允许被修改的,所以代码区和常量区的内容编译后存储在ROM中。
栈、堆、全局区(.bss段、.data段)都是存放在RAM中
嵌入式中RAM资源比ROM更紧缺!

面试:
1、一个嵌入式系统欢迎语句应该如何定义 下面哪种更好?为什么?
char welcome[] = “welcome”; //.data中

const welcome[] = “welcome”; //.reodata或者text 加上const更好
char* welcome = “welcome”; //.reodata或者text 加上const更好
const char* welcome = “welcome”; //.reodata或者text 加上const更好

首先,在嵌入式系统RAM资源比ROM资源更紧缺。
第一种变量 占据栈资源,存放在RAM中。
第二种是常量 占据在静态全局变量中.rodata,存放在ROM中。
所以第二种更好。

2、char* welcome = “welcome”;
(补充:以上写法和char welcome[] = “welcome”; 两种写法完全不一样 可以通过welcome[0]='D’修改)
可以使用welcome[0] = ‘D’;去修改welcome指向的字符型吗?
不能,因为welcome指向的字符串存放在.rodata(只读)中,不允许修改。

3、某个局部变量定义为Size巨大的数据和结构体,好吗?为什么?
不好,局部变量是分配Stack区,RAM中,空间有限,很有可能造成栈溢出问题。

4、实践作业

修改图形成变量,查看割内存占用大小。

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

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

相关文章

sql优化慢查询

1.慢查询设置 慢查询设置(临时) -- 查看是否开启了慢查询日志 show variables like slow%;-- 开启慢查询日志 set global slow_query_log on;-- 更改日志路径 set global slow_query_log_file /data/mydata/app1-slow.log;-- 查看慢查询时间临界值&…

学习笔记-主成分分析法

定义 主成分分析是一种降维算法,它能将多个指标转换为少数几个主成分,这些主成分是原始变量的线性组合,且彼此之间互不相关,其能反映出原始数据的大部分信息。一般来说,当研究的问题涉及到多变量且变量之间存…

synchronize锁详解

目录 1、什么是synchronize? 2、为什么要用synchronize锁? 2.1 代码演示 2.2 原因分析 2.3 专有名词解释 2.3.1 临界资源 2.3.2 临界区 2.3.3 竞态条件 3、synchronize锁的原理 3.1 锁升级过程 3.1.1 偏向锁 3.1.2 轻量级锁 3.1.3 重量级锁…

【设计模式】七大设计原则--------单一职责原则

文章目录 1.案例1.1 原始案例1.2 改进一:类上遵循单一职责原则1.3 改进二:方法上遵循单一职责原则 2.小结 1.案例 1.1 原始案例 package com.sdnu.principle.singleresponsibility; //客户端 public class singleResponsibility {public static void m…

选择什么电容笔比较好?平价好用的iPad电容笔推荐

科学技术的迅速发展使人们的生活发生了巨大的变化。如今,众多的电子和数码产品层出不穷,而这种能够与平板电脑配套的电容笔也是如此。随着电容笔的不断发展,其应用范围也将不断扩大,今天,我将向大家推荐一些具有较高性…

总结:一文搞懂chatGPT原理

目前关于chatGPT的资料过于零散,没有详尽所有知识点、系统概述的文章,因此,笔者作了这篇总结性文章。 训练过程总览 理清演化路径 预训练(pretrain) GPT-3概述 GPT 3模型的理念 GPT-3如何学习 数据集 指令微调 (Instruction Fine-Tunin…

八大排序之交换排序与计数排序

此篇更新完成后,八大排序已经全部写完,还请各位可以多多支持!🥰 八大排序之选择排序_冷兮雪的博客-CSDN博客 八大排序之插入排序和归并排序_冷兮雪的博客-CSDN博客 目录 交换排序的基本思想🍭 一、冒泡排序&#x1f…

JS文件断点续传的切割与合并

总结一下大文件分片上传和断点续传的问题。因为文件过大(比如1G以上),必须要考虑上传过程网络中断的情况。http的网络请求中本身就已经具备了分片上传功能,当传输的文件比较大时,http协议自动会将文件切片(…

基于html+css的图展示43

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

制冷暖通工业互联网平台建设

制冷暖通工业互联网平台建设需要遵循一定的流程,具体步骤如下: 需求分析:了解客户需求,包括业务流程、系统功能、界面设计等方面。 系统设计:基于需求分析,进行系统设计,包括系统结构、数据库设…

【细读Spring Boot源码】prepareContext之load

前言 启动过程中准备上下文中有一步加载在资源,下面看下详情 详情 调用点 private void prepareContext(DefaultBootstrapContext bootstrapContext, ConfigurableApplicationContext context,ConfigurableEnvironment environment, SpringApplicationRunListen…

大模型跨界研究:计算精神病学发现,大模型居然比人类更焦虑

夕小瑶科技说 原创作者 | 小戏、iven 纽约时报的记者凯文鲁斯(Kevin Roose)在 2 月份和必应的大模型 Sydney 聊了两个小时天,却惊讶的收到了这样一条回复“我是 Sydney,我爱上了你”。 鲁斯向 Sydney 讲了一些关于荣格“黑暗自我”…

python哲学

进入python编辑器模式下,输入import this 会打印python之禅(The Zen of Python) Beautiful is better than ugly. 优美胜于丑陋。 Explicit is better than implicit. 明了胜于晦涩。 Simple is better than complex. 简单胜过复杂。 Complex is better than co…

写给初学者的YOLO目标检测 概述

文章目录 什么是目标检测What is YOLO?为什么YOLO在目标检测领域如此流行?1. 速度快2. 高检测精度3. 更好的泛化性4. 开源 YOLO架构YOLO目标检测是如何工作的?残差块(Residual blocks)边界框回归(Bounding box regression)交并比…

项目中的统一异常处理

目录 1:异常处理 1.1:异常问题分析 1.2:统一异常处理实现 1.2.1:全局异常处理器 1.2.2:自定义异常类 1.2.3:统一响应前端异常信息封装类 1.2.4:通用的异常信息枚举类 1.2.5:…

Android Studio小白安装教程,以及第一个Android项目案例的调试运行

小白友好型教学: 本文从小白角度出发,手把手教你一步一步成功安装“Android Studio”,并结合案例,编写你的第一个手机APP到手机上运行。由于安装过程较长,建议大家跟着截图,注意细节,不然容易出…

改进YOLOv8 | Neck篇 | YOLOv8 应用轻量级通用上采样算子CARAFE | 《特征的内容感知重组》

特征上采样是现代卷积神经网络架构中的关键操作,例如特征金字塔。其设计对于密集预测任务,如目标检测和语义/实例分割至关重要。在本研究中,我们提出了一种称为内容感知特征重组(CARAFE)的通用、轻量级且高效的操作符,以实现这一目标。CARAFE具有以下几个优点:(1)大的…

Visual Studio 2019 C# 上位机入门(1):如何创建工程编写一个简单应用

Visual Studio 2019下载安装步骤可以看:https://blog.csdn.net/weixin_44788542/article/details/114271126 这里不赘述,默认电脑上已经安装好了。 1、打开安装好的Visual Studio后,选择创建新项目。 2、找到选择C#下面的Windows 窗体应用&…

【源码】Spring Cloud Gateway 是在哪里调用后端真实服务的?

前言 我们知道 Spring Cloud Gateway 最终一定会将请求路由到后端的真实服务上,那么你知道 Spring Cloud Gateway 是在哪里调用的后端服务吗? 源码之下无秘密,让我们一起从源码中寻找答案。 源码分析 上图是来自Spring Cloud Gateway 官网…

Apache Druid RCE漏洞复现(QVD-2023-9629)

0x01 产品简介 Apache Druid是一个高性能的实时大数据分析引擎,支持快速数据摄取、实时查询和数据可视化。它主要用于OLAP(在线分析处理)场景,能处理PB级别的数据。Druid具有高度可扩展、低延迟和高吞吐量的特点,广泛应…