一、程序运行时内存四大区

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

二、函数的底层原理

每个函数都有一个属于自己的栈空间,用来记录函数的必要信息

  1. 按调用约定传参

    • 参数的传递方向(是从右向左还是从左向右传参)
    • 参数的存储媒介(参数放寄存器还是栈区或者其他)
    • 谁负责释放(平衡)参数空间
    • 返回值的处理
__cdecl __stdcall __fastcall
解释 C调用约定,美国国标标准,默认调用约定 标准约定,微软的规定,微软操作系统使用的调用规定,Windows API的标准调用约定 快速约定,只有微软某一系列编译器独有的,未标准化,不同编译器可能没有或者实现不一致
参数传递方式 从右往左,通过栈传递 从右往左,通过栈传递 左数前两个参数放在ecx、edx寄存器中,其余从右往左通过栈传递
谁清理栈上参数 调用者(caller) 被调者(callee) 被调者(callee)
编译器参数 /Gd /Gz /Gr
可变参 支持 不支持 不支持
  1. 在栈顶保存返回地址

  2. 保存调用方的栈信息(调用方的栈底位置)

  3. 更新栈位置(在处理器里)到被调用方的栈底处

  4. 在栈内开辟局部变量的空间

    ​ 编译器此时会统计局部变量的大小(占多大空间),然后以此开辟足够空间

    ​ 调试版开辟的空间大于等于实际局部变量的大小,发行版(优化版)开辟的空间小于等于实际局部变量的大小

     使用`/O1`和`/O2`编译选项会根据变量使用情况,会分配小于等于变量大小的空间,例:
    // 第一种优化情况
    // 如果开了优化,编译器不会给局部变量nNum开辟空间
    // 而是直接使用 printf("%d",3);
    int nNum = 3;
    printf("%d",nNum) // 第二种优化情况
    // 根据情况使用寄存器存储变量

    ​ 编译选项有/Zi+/Od(调试版且不优化),则填充局部变量空间为0xcc

  5. 保存寄存器环境

  6. 执行函数体

  7. 恢复寄存器环境

  8. 释放局部变量空间

  9. 恢复栈信息到调用方

  10. 如果是 __cdecl,先取出返回地址,并按此返回地址作流程更新,抵达新地址后,由调用方清理参数;

    如果是 __fastcall,__stdcall,先取出返回地址,并清理参数,然后按返回地址作流程更新

三、函数的递归调用

递归善于处理非线性问题,不善于处理线性问题,循环善于解决线性问题

  • 线性问题:有唯一的前驱且有唯一的后继的问题,例:n的累加
  • 非线性问题:A问题产生分支,产生了B1问题和B2问题,B1与B2合并产生C问题,C问题又回归到A问题

四、函数注释规范

  1. 函数功能
  2. 各个参数意义
  3. 返回值意义(void写无,不能不写)
  4. 备注或其他信息
  5. 版本和修改日期,修改人(看公司需要)

五、附加知识

  • Alt+F8(VC++6.0代码对齐快捷键)
  • 函数可以通过提供.obj文件或动态链接库给别人使用
  • 裸函数不属于调用约定,是一个关键字,让编译器不为此函数生成任何代码的关键字
  • Fibonacci数列可求黄金分割比例,越后面的前一项和后一项的比值越接近0.618
  • 函数名前加_表示内层函数

C-05\函数的底层原理的更多相关文章

  1. PHP函数的实现原理及性能分析

    前言 在任何语言中,函数都是最基本的组成单元.对于php的函数,它具有哪些特点?函数调用是怎么实现的?php函数的性能如何,有什么使用建议?本文将从原理出发进行分析结合实际的性能测试尝试对这些问题进行 ...

  2. Neo4j图数据库简介和底层原理

    现实中很多数据都是用图来表达的,比如社交网络中人与人的关系.地图数据.或是基因信息等等.RDBMS并不适合表达这类数据,而且由于海量数据的存在,让其显得捉襟见肘.NoSQL数据库的兴起,很好地解决了海 ...

  3. malloc函数的底层实现你是否清楚

    malloc函数的底层实现你是否清楚 说起malloc函数,每个人都能说出它的功能,而且我们经常会用到,那么今天我要说的是关于malloc函数在编译器的底层实现,如果你对它的实现已经很清楚了,那么你可 ...

  4. 【T-SQL进阶】02.理解SQL查询的底层原理

    本系列[T-SQL]主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础]04.表表达式 ...

  5. 操作系统底层原理与Python中socket解读

    目录 操作系统底层原理 网络通信原理 网络基础架构 局域网与交换机/网络常见术语 OSI七层协议 TCP/IP五层模型讲解 Python中Socket模块解读 TCP协议和UDP协议 操作系统底层原理 ...

  6. 《React Native 精解与实战》书籍连载「React Native 底层原理」

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

  7. 并发之volatile底层原理

    15.深入分析Volatile的实现原理 14.java多线程编程底层原理剖析以及volatile原理 13.Java中Volatile底层原理与应用 12.Java多线程-java.util.con ...

  8. MVC底层原理

    窥探ASP.Net MVC底层原理 实现跨越Session的分布式TempData 1.问题的引出 我相信大家在项目中都使用过TempData,TempData是一个字典集合,一般用于两个请求之间临时 ...

  9. iOS底层原理总结 - 探寻block的本质(一)

        面试题 block的原理是怎样的?本质是什么? __block的作用是什么?有什么使用注意点? block的属性修饰词为什么是copy?使用block有哪些使用注意? block在修改NSMu ...

  10. 【Socket】linux黑客之网络嗅探底层原理

      1.mystery引入 1)网络嗅探属于网络攻防类的安全软件,其基于原始套接字技术开发的 2)原始套接字是一种套接字底层技术,它工作在网络层 3)谈到网络安全,刚好本学期学过这门课程,这里myst ...

随机推荐

  1. 这是不是你想要了解SQL的艺术,基础语法等等

    一.基础sql语句: 模块定义 基础语句 基础功能 数据定义 create table 创建数据库表 drop table 删除数据表 alter table 修改表结构 create view 创建 ...

  2. C#使用附加到进程调试

    微软官网的调试进程介绍 首先运行bin下的可执行文件,然后打开源代码,选择调试--->附加到进程.

  3. 数据库json字段类型总结

    ----------------------------------------=================以下是个人自己总结,可能只有自己看的懂.===================---- ...

  4. NLP手札1. 金融信息负面及主体判定方案梳理&代码实现

    这个系列会针对NLP比赛,经典问题的解决方案进行梳理并给出代码复现~也算是找个理由把代码从TF搬运到torch.Chapter1是CCF BDC2019的赛题:金融信息负面及主体判定,属于实体关联的情 ...

  5. js-day05-对象

    为什么要学习对象 没有对象时,保存网站用户信息时不方便,很难区别 对象是什么 1.对象是一种数据类型 2.无序的数据集合 对象有什么特点 1.无序的数据的集合 2.可以详细的描述某个事物' 对象使用 ...

  6. 为什么Git远程仓库中要配置公钥?

    最近在使用阿里云效平台代码管理,首次使用新建仓库,使用SSH时需要配置公钥.之前也在GitHub.Gitee上配置过,每次都能正常使用,也没有思考过为什么要配置公钥.这次记录一下其中的原理. 本地和远 ...

  7. 历时9个月重构iNeuOS工业互联网操作系统,打造工业领域的“Office”

    目       录 1.      概述... 1 2.      整体介绍... 2 3.      主要功能简介... 5 1.   概述 历时9个月的时间,对iNeuOS工业互联网操作系统进行全 ...

  8. 自研ORM框架实现工作单元模式

    平时我们使用事务,需要显示的Try Catch 并且开启事务 提交事务 异常回滚事务 三步骤,使用工作单元后则只需要Commit. 1.接口定义 1 /// <summary> 2 /// ...

  9. 2022年7月9日 第四组 周鹏 HTML的初认识

    <!DOCTYPE html> <html lang="en"> <!--      文档的根标签 --> <head>     & ...

  10. [0x12] 132.小组队列

    题意 link(more:UVA540) 简化题意:对 \(n\) 个小组排队,每个小组有至多 \(m\) 个成员(每个成员有唯一编号 \(x\)),当一个人来到队伍时,如果队中有同组成员,直接插入其 ...