C-05\函数的底层原理
一、程序运行时内存四大区
wres(内存属性):
- w:
write(可写) - r:
read(可读) - e:
execute(可执行) - s:
share(可共享)
任何操作系统(windows、liunx、安卓、ios等)上的程序在运行时,都有内存四大区,分别为:代码区(code),数据区(data),栈区(stack),堆区(heap)
代码区(code):存放二进制可执行代码,内存属性为re
数据区(data):存放全局变量,静态变量和常量(C语言)
init:已初始化数据区:存放已初始化的全局变量和静态变量,还有常量rw:可读写数据区(存放已赋初值的全局变量和静态变量)r:只读数据区(存放常量)
uninit:未初始化数据区:存放未初始化的全局变量和静态变量,内存属性为rw
栈区(stack):先进后出,后进先出(类似弹夹),内存属性为rw。经常被翻译为堆栈,其实就是栈区,这是老一辈翻译国外技术书籍时候的一个习惯,喜欢成对成对的用词,而中国传统习惯是后者定性,例:礼无可恕,情有可原。那么你就被放了,没事。如果说 情有可原,礼无可恕,那么你就摊上大事了。再例:牛奶,是奶;奶牛,是牛。所以指针数组是数组,数组指针是指针
堆区(heap):内存属性为rw

二、函数的底层原理
每个函数都有一个属于自己的栈空间,用来记录函数的必要信息
- 按调用约定传参
- 参数的传递方向(是从右向左还是从左向右传参)
- 参数的存储媒介(参数放寄存器还是栈区或者其他)
- 谁负责释放(平衡)参数空间
- 返回值的处理
__cdecl |
__stdcall |
__fastcall |
|
|---|---|---|---|
| 解释 | C调用约定,美国国标标准,默认调用约定 | 标准约定,微软的规定,微软操作系统使用的调用规定,Windows API的标准调用约定 |
快速约定,只有微软某一系列编译器独有的,未标准化,不同编译器可能没有或者实现不一致 |
| 参数传递方式 | 从右往左,通过栈传递 | 从右往左,通过栈传递 | 左数前两个参数放在ecx、edx寄存器中,其余从右往左通过栈传递 |
| 谁清理栈上参数 | 调用者(caller) | 被调者(callee) | 被调者(callee) |
| 编译器参数 | /Gd |
/Gz |
/Gr |
| 可变参 | 支持 | 不支持 | 不支持 |
在栈顶保存返回地址
保存调用方的栈信息(调用方的栈底位置)
更新栈位置(在处理器里)到被调用方的栈底处
在栈内开辟局部变量的空间
编译器此时会统计局部变量的大小(占多大空间),然后以此开辟足够空间
调试版开辟的空间大于等于实际局部变量的大小,发行版(优化版)开辟的空间小于等于实际局部变量的大小
使用`/O1`和`/O2`编译选项会根据变量使用情况,会分配小于等于变量大小的空间,例:
// 第一种优化情况
// 如果开了优化,编译器不会给局部变量nNum开辟空间
// 而是直接使用 printf("%d",3);
int nNum = 3;
printf("%d",nNum) // 第二种优化情况
// 根据情况使用寄存器存储变量
编译选项有
/Zi+/Od(调试版且不优化),则填充局部变量空间为0xcc保存寄存器环境
执行函数体
恢复寄存器环境
释放局部变量空间
恢复栈信息到调用方
如果是
__cdecl,先取出返回地址,并按此返回地址作流程更新,抵达新地址后,由调用方清理参数;如果是
__fastcall,__stdcall,先取出返回地址,并清理参数,然后按返回地址作流程更新
三、函数的递归调用
递归善于处理非线性问题,不善于处理线性问题,循环善于解决线性问题
- 线性问题:有唯一的前驱且有唯一的后继的问题,例:n的累加
- 非线性问题:A问题产生分支,产生了
B1问题和B2问题,B1与B2合并产生C问题,C问题又回归到A问题

四、函数注释规范
- 函数功能
- 各个参数意义
- 返回值意义(void写无,不能不写)
- 备注或其他信息
- 版本和修改日期,修改人(看公司需要)
五、附加知识
Alt+F8(VC++6.0代码对齐快捷键)- 函数可以通过提供.obj文件或动态链接库给别人使用
- 裸函数不属于调用约定,是一个关键字,让编译器不为此函数生成任何代码的关键字
- Fibonacci数列可求黄金分割比例,越后面的前一项和后一项的比值越接近0.618
- 函数名前加
_表示内层函数
C-05\函数的底层原理的更多相关文章
- PHP函数的实现原理及性能分析
前言 在任何语言中,函数都是最基本的组成单元.对于php的函数,它具有哪些特点?函数调用是怎么实现的?php函数的性能如何,有什么使用建议?本文将从原理出发进行分析结合实际的性能测试尝试对这些问题进行 ...
- Neo4j图数据库简介和底层原理
现实中很多数据都是用图来表达的,比如社交网络中人与人的关系.地图数据.或是基因信息等等.RDBMS并不适合表达这类数据,而且由于海量数据的存在,让其显得捉襟见肘.NoSQL数据库的兴起,很好地解决了海 ...
- malloc函数的底层实现你是否清楚
malloc函数的底层实现你是否清楚 说起malloc函数,每个人都能说出它的功能,而且我们经常会用到,那么今天我要说的是关于malloc函数在编译器的底层实现,如果你对它的实现已经很清楚了,那么你可 ...
- 【T-SQL进阶】02.理解SQL查询的底层原理
本系列[T-SQL]主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础]04.表表达式 ...
- 操作系统底层原理与Python中socket解读
目录 操作系统底层原理 网络通信原理 网络基础架构 局域网与交换机/网络常见术语 OSI七层协议 TCP/IP五层模型讲解 Python中Socket模块解读 TCP协议和UDP协议 操作系统底层原理 ...
- 《React Native 精解与实战》书籍连载「React Native 底层原理」
此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...
- 并发之volatile底层原理
15.深入分析Volatile的实现原理 14.java多线程编程底层原理剖析以及volatile原理 13.Java中Volatile底层原理与应用 12.Java多线程-java.util.con ...
- MVC底层原理
窥探ASP.Net MVC底层原理 实现跨越Session的分布式TempData 1.问题的引出 我相信大家在项目中都使用过TempData,TempData是一个字典集合,一般用于两个请求之间临时 ...
- iOS底层原理总结 - 探寻block的本质(一)
面试题 block的原理是怎样的?本质是什么? __block的作用是什么?有什么使用注意点? block的属性修饰词为什么是copy?使用block有哪些使用注意? block在修改NSMu ...
- 【Socket】linux黑客之网络嗅探底层原理
1.mystery引入 1)网络嗅探属于网络攻防类的安全软件,其基于原始套接字技术开发的 2)原始套接字是一种套接字底层技术,它工作在网络层 3)谈到网络安全,刚好本学期学过这门课程,这里myst ...
随机推荐
- .Net6新版本的AssemblyLoadContext 加载程序集和卸载程序集
准备俩个项目 第一个是控制台 第二个项目是类库 类库项目中只有一个示例class 将类库的代码生成dll 并且设置属性为复制到输出目录 using System.Runtime.Loader; var ...
- Reversal
# 35. Reversal- 出题人:OJ- 标签:["String"]- 难度:简单- 总分数:100## 题目描述<p>输入一个英文句子,句子包含若干个单词,每个 ...
- 硬核!Apache Hudi Schema演变深度分析与应用
1.场景需求 在医疗场景下,涉及到的业务库有几十个,可能有上万张表要做实时入湖,其中还有某些库的表结构修改操作是通过业务人员在网页手工实现,自由度较高,导致整体上存在非常多的新增列,删除列,改列名的情 ...
- 深度学习之tensorflow2实战:多输出模型
欢迎来到CNN实战,尽管我们刚刚开始,但还是要往前看!让我们开始吧! 数据集 链接:https://pan.baidu.com/s/1zztS32iuNynepLq7jiF6RA 提取码:ilxh,请 ...
- devexpress中dockManager保存布局后恢复不正常
在使用dockManager保存布局后进行恢复发现不正常,与中间的gridcontorl接触的都不行.gridcontorl设置的填充是fill 所以在在界面上再添加一个PanelControl控件并 ...
- 2022年鲜为人知的CSS 特性了解起来~
前言 随着CSS的不断发展,一些很酷且有用的属性要么完全被忽视,要么由于某种原因不像其他常见属性那样被开发者熟练应用.这篇文章我们将一起学习那些CSS中陌生但非常有用的CSS属性,这些属性你可能听说过 ...
- 【Java EE】Day03 DQL、约束、数据库设计、范式、备份和还原
〇.总结 1.DQL 聚合函数有空值需要使用ifnull函数 where不能使用聚合函数 分页开始索引的计算,及mysql和oracle的方言 2.约束 删除唯一约束DROP INDEX 列名; 3. ...
- CORS与CSRF在Spring Security中的使用
背景 在项目使用了Spring Security之后,很多接口无法访问了,从浏览器的网络调试窗看到的是CORS的报错和403的报错 分析 我们先来看一下CORS是什么,和它很相似的CSRF是什么,在S ...
- 前段知识之CSS
目录 CSS层叠样式表 CSS语法结构: CSS注释语法 引入css的多种方式 CSS选择器 1. CSS基本选择器 2. CSS组合选择器 3. 分组与嵌套 4. 属性选择器 5. 伪类选择器 6. ...
- 洛谷P1434例题分析
[SHOI2002] 滑雪 题目描述 Michael 喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Mic ...