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

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的标准调用约定 快速约定,只有微软某一系列编译器独有的,未标准化,不同编译器可能没有或者实现不一致
参数传递方式 从右往左,通过栈传递 从右往左,通过栈传递 左数前两个参数放在ecxedx寄存器中,其余从右往左通过栈传递
谁清理栈上参数 调用者(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问题,B1B2合并产生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. AI音乐创作,让每一个人都成为音乐家

    从录音带.MP3到专业的耳机.音箱,随着音乐消费方式的不断升级,音乐创作的专业"门槛"也在AI技术的加持下逐渐大众化,创作者的创新设计.创作频率也在持续增强,能降低创作门槛且智能化 ...

  2. 关于mysql命令的学习

    前言 这篇文章我不会具体说明哪些操作有哪些命令,我只说明这些命令的记忆方法.其实知道原理后,这些命令尽管多,但都是有据可循的 mysql提示符 可以通过登录时加入 –prompt 提示符内容 参数 登 ...

  3. 环境安装-Centos7.4安装及配置

    环境安装-Centos7.4安装及配置 〇.资料汇总 一.虚拟机安装 1.下载地址 https://pan.baidu.com/s/1zcOp06HX4OxPdsCCGkHbXQ 提取码:7777 2 ...

  4. 【Linux】个人笔记本安装Centos并开放22端口供外网连接

    〇.参考资料 一.配置及安装内容 (一)配置 [today]低配笔记本(装centos):4+500G 个人电脑(装三个节点的虚拟机集群环境):8+628G (二)所装软件 Linux系统(可选cen ...

  5. 【Java SE进阶】Day04 Map、Debug

    一.Map集合 1.概述 映射 /双列集合 集合分为Collection(存储一个元素 )和Map(存储一对元素) 键不能重复,值可以重复 2.常用子类 HashMap 哈希表存储数据 元素存取数据不 ...

  6. 【算法题型总结】--6、BFS

    // 计算从起点 start 到终点 target 的最近距离 int BFS(Node start, Node target) { Queue<Node> q; // 核心数据结构 Se ...

  7. 解决笔记本安装centos7后无法调节屏幕亮度

    起因:本人有台老古董笔记本,大约是10年前左右了,三星rv411,配置较低无法安装win7以上的系统.装个CentOS7正好可以拿来学习Linux系统. 但是遇到一个特别恶心的情况,笔记本上调节屏幕亮 ...

  8. 快速学会慢查询SQL排查

    转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/c56bd0c5.html 你好,我是测试蔡坨坨. 在往期文章中,我们聊过数据库基础知识,可参考「数据库基础,看完这篇就够了! ...

  9. 填坑日志-云网络智慧课堂双网卡Mac地址读取错误的问题及解决

    云网络智慧课堂的双网卡问题记录及解决方案 教师端 其实这里双网卡的问题一直没有解决,分为了两部分,一部分是教师端,一部分是学生端.症状类似,问题也类似,都是在设计之初因为硬件限制可能没有考虑到双网卡的 ...

  10. pytest常用参数汇总

    1.  -s    表示输出调试信息,包括print打印信息 D:\demo>pytest -s ./pytest_1 ===================================== ...