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

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. onps栈使用说明(1)——API接口手册

    1. 底层API 由协议栈底层提供的api,用于涉及底层操作的一些功能实现,这些api接口函数的原型定义分布于不同的文件,它们被统一include进了onps.h中: open_npstack_loa ...

  2. 倍福Ads协议通信测试

    测试环境:vs2015 + TC31-Full-Setup.3.1.4022.30.exe 首先需要安装TC31-Full-Setup.3.1.4022.30.exe 本例子是用本机作测试,如果使用远 ...

  3. 基于python的数学建模---pulp库

    instance 代码: import pulp z = [2, 3, 1] a = [[1, 4, 2], [3, 2, 0]] b = [8, 6] aeq = [[1,2,4]] beq = [ ...

  4. 系统内置APK并签名并配置AndroidStudio

    前言 最近在集成内置APK的时候遇到了些问题,遂整理一份文档以记录. 一,APP内置进系统固件 将APK源码或编译出的apk文件放在package或vendor等目录下,并且编写相应的android, ...

  5. .NET周报【11月第4期 2022-11-30】

    国内文章 .NET 7 的 AOT 到底能不能扛反编译? https://www.cnblogs.com/huangxincheng/p/16917197.html 在B站,公众号上发了一篇 AOT ...

  6. Dart语言简介

    简单介绍Dart语言 Dart是一种针对客户优化的语言,亦可在任何平台上快速开发的应用陈旭. 目标是为多平台开发提供最高效的变成语言,并为应用程序框架搭配了领会的运行时执行平台. Dart特点 Dar ...

  7. bug处理记录:com.fasterxml.jackson.core.JsonParseException: Illegal unquoted character ((CTRL-CHAR, code 9)): has to be escaped using backslash to be included in string value at [Source:

    1. 报错: com.fasterxml.jackson.core.JsonParseException: Illegal unquoted character ((CTRL-CHAR, code 9 ...

  8. MySQL事务(四大特征)-存储过程

    目录 一:事务 1.四大特性(ACID) 2.事物存在的必要性(真实比喻) 3.如何使用事务 4.开启事务-回滚-确认 二:事务案例实战 1.模拟消费 2.创建 3.插入数据 4.开启事务 5.修改操 ...

  9. STL list容器API

    list容器:链表容器,不支持随机遍历.不能用通用的sort算法(要有随机访问迭代器),容器自己有排序算法 #define _CRT_SECURE_NO_WARNINGS #include<io ...

  10. linux系统中安装虚拟机

    在linux系统中,利用图形化界面安装虚拟机.首先启动 virt-manager,当然没有安装 virt-manager需要先安装好. 1 $ apt-get install virt-manager ...