CSDN话题挑战赛第2期
参赛话题:学习笔记

目录

一、通过DLL文件实现函数共有

二、通过调用 _stdcall 来减少程序文件的大小


Windows是以图形界面为基础的操作系统。它的前身是 MS-DOC,最初的版本可以在128kb的内存上运行程序,但是现在想要Windows运行流畅至少需要512MB的内存,但通常往往是不够的

很多人认为可以使用虚拟内存来解决内存不足的情况,而虚拟内存确实能够在内存不足的时候提供补充,但是使用虚拟内存的Page In 和 Page Out 通常伴随着低速的磁盘访问,这是一种得不偿失的表现。所以虚拟内存无法从根本上解决内存不足的情况

为了从根本上解决内存不足的情况,要么是增加内存的容量,加内存条;要么优化应用程序,使其尽可能变小。第一种建议往往要需要衡量口袋的银子,所以我们只关注第二种情况

注意:以下的篇幅会涉及到C语言的介绍,是每个程序员(不限语言)都需要知道和了解的知识

一、通过DLL文件实现函数共有

        DLL(Dynamic Link Library)文件,是一种 动态链接库 文件,顾名思义,是在程序运行时可以动态加载 Library(函数和数据的集合)的文件。此外,多个应用可以共有同一个DLL文件,而通过共有一个DLL文件则可以达到节约内存的效果

例如,假设我们编写的一个具有处理功能的函数 MyFunc() 。应用A 和 应用B 都需要用到这个函数,然后在各自的应用程序中内置 MyFunc() (这个称为Static Link,静态链接)后同时运行两个应用,内存中就存在了同一个函数的两个程序,这就造成资源浪费

静态链接导致内存利用率下降:

为了改变这一点,使用DLL文件而不是应用程序的执行文件(EXE文件)。因为同一个DLL文件内容在运行时可以被多个应用共有,因此内存中存放函数MyFunc() 的程序就只有一个

使用动态链接DDL改善内存使用:

Windows操作系统其实就是无数个DLL文件的集合体。有些应用在安装时,DLL文件也会被追加,应用程序通过这些DLL文件来运行,既可以节约内存,也可以在不升级EXE文件的情况下,通过升级DLL文件就可以完成更新

二、通过调用 _stdcall 来减少程序文件的大小

通过调用 _stdcoll 来减少文件的方法,是用C语言编写应用时可以利用的高级技巧

_stdcall 是 standard call(标准调用)的缩写。Windows提供的DLL文件内的函数,基本上都是通过 _stdcall 调用方式来完成的,这主要是为了节约内存。另一方面,用C语言编写的程序默认都不是 _stdcall。C语言特有的调用方式称为 C 调用。C语言默认不使用 _stdcall 的原因的是因为 C 语言所对应的函数传入参数是可变的,只有函数调用方才能知道到底有多少个参数,在这种情况下,栈的清理作业便无法进行。不过,在C语言中,如果函数的参数和数量固定的话,指定 _stdcall 是没有任何问题的

C语言和Java最主要的区别之一在于C语言需要人为控制释放内存空间

C语言中,在调用函数后,需要人为执行栈清理指令。把不需要的数据从接收和传递函数的参数时使用的内存上的栈区域中清理出来的操作叫做 栈清理处理

例如下面代码:

//函数调用方
void main(){int a;a = MyFunc(123,456);
}//被调用方
int MyFunc(int a,int b){...
}

代码中,从main主函数调用到MyFunc() 方法,按照默认的设定,栈的清理处理会附加在main主函数这一方。在同一程序中,有可能会多次调用,导致MyFunc()会进行多次清理,这就会造成内存的浪费

汇编之后的代码如下:

push 1C8h        //将参数 456(= 1C8h)存入栈中
push 7Bh        //将参数 123(= 7Bh)存入栈中
call @LTD+15(MyFunc)(00401014) //调用 MyFunc函数
add esp,8       //运行栈清理

C 语言通过栈来传递函数的参数,使用 push 是往栈中存入数据的指令,pop 是从栈中取出数据的指令。32位CPU中,1次push指令可以存储4个字节(32位)的数据。上述代码由于进行了两次push操作,所以存储了8字节的数据。通过 call 指令来调用函数,调用完成后,栈中存储的数据就不再需要了。于是就通过add esp,8 这个指令,使存储着栈数据的 esp 寄存器前进8位(设定为指向高8位字节的地址),来进行数据清理。由于栈是在各种情况下都可以利用的内存领域,因此使用完毕后有必要将其恢复到原始状态。上述操作就是执行栈的清理工作。另外,在C语言中,函数的返回值,是通过寄存器而非栈来返回的

栈执行清理工作,在调用方法处执行清理工作和在反复调用方法处执行清理工作不同,使用_stdcall 标准调用的方式称为反复调用方法,在这种情况下执行栈清理开销比较小。

不同方式的调用方式也不同:

通过DLL文件实现函数共有及通过调用_stdcall来减少程序文件的大小相关推荐

  1. python函数文档说明调用方式_Python 跨.py文件调用自定义函数说明

    0 前言 os.chdir() :用于改变当前python工作的目录到指定的路径 sys.path:是python搜索模块的一个路径集,为list,自定义的包可以把存放路径加进去,之后直接调用包名就行 ...

  2. android敏感api函数,基于敏感API调用的Android应用程序动态监控

    摘要: 近年来,Android操作系统凭借其开源的优势,占领了移动操作系统市场.Android通过对外提供API接口重组资源,吸引了大量第三方开发人员创造出功能丰富的Android应用.但是,由于An ...

  3. 『PHP』phar文件详解_phar文件格式_调用phar类方法生成phar文件

    phar简介 phar,全称为PHP Archive,phar扩展提供了一种将整个PHP应用程序放入.phar文件中的方法,以方便移动.安装..phar文件的最大特点是将几个文件组合成一个文件的便捷方 ...

  4. Linux高级应用(二)文件IO函数与液晶屏显示

    一.结构体占用的内存 struct test { char a; int b; short c; long d; char *p; }; 求该结构体占用的内存?sizeof(struct test) ...

  5. c语言读取文件函数,C语言文件操作详细分析:读取文件(fread函数使用)

    C语言文件操作详细分析:读取文件(fread函数使用) 这里详细介绍了C语言读取文件的函数fread的使用说明,参照了MSDN的说明,同时加入自己的经验让大家学的更加明白. C语言读取文件函数frea ...

  6. c语言的函数头书写标准,C语言的头文件的函数和书写方法.doc

    C语言的头文件的函数和书写方法 C语言头文件作用及写法 头文件几个好处: 1,头文件可以定义所用的函数列表,方便查阅你可以调用的函数:2,头文件可以定义很多宏定义,就是一些全局静态变量的定义,在这样的 ...

  7. 使用VS2010调用matlab的mat格式文件

    做实验需要将matlab实现的meanshift的结果中的region的Iabels矩阵,需要把labels.mat读入VS2010中,实现功能,在此把实现过程记录下来. C++读取mat文件的步骤如 ...

  8. 假设有python程序文件_《Python程序设计》题库

    一.填空题 第一章 基础知识 1 . Python 安装扩展库常用的是 _______ 工具.( pip ) 2 . Python 标准库 math 中用来计算平方根的函数是 __________ . ...

  9. C#发布程序添加其他程序文件

    注:程序发布文件,默认只发布自身程序直接引用的相关文件(A程序). 如果需要添加其他程序(不同的应用程序B)文件,操作方法如下: 第一步:将B程序文件复制到A程序 第二步:将B程序文件右键--> ...

  10. 小程序文件批量下载保存

    小程序批量下载文件到本地用户文件夹 由于小程序大小2M限制所以用到的音频图片啥的可以放到第三方平台百度网盘或小程序云储存,然后在用户首次使用时把资源下载到本地,以后启动时检查是否存在此文件不在就下载, ...

最新文章

  1. springmvc环境搭建及实例
  2. 碰到问题集锦(简述)1
  3. 一个可供中小团队参考的微服务架构技术栈
  4. 用c语言链表做一个词典,电子字典C语言链表版
  5. 调用Xvid编码器流程(基于xvid1.1.0)
  6. java 中符号_谁能告诉我java中符号的用法,见代码
  7. linux不能更改密码,Linux服务器无法更改密码的解决办法--passwd: User not known
  8. Django之ORM对数据库操作
  9. GYM 101875 2018 USP-ICMC
  10. 如何对您的API进行单元测试
  11. POI报表入门,excel,使用事件模型解析百万数据excel报表
  12. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_2 连接池介绍
  13. 计算机学报发表论文格式,计算机学报论文格式(24页)-原创力文档
  14. 百度地图API秘钥问题
  15. 第1天——R语言介绍
  16. 符号熵(附matlab代码)
  17. 计算机课app开发,毕业设计(论文)-基于Android的《计算机网络基础》课程App的设计与开发.doc...
  18. 《交互式程序设计 第2版》一1.2.4 交互语言
  19. EasyExcel的使用
  20. NRF24L01的配置详解

热门文章

  1. MongoDB 下载地址列表
  2. 数据分析 - 用户中台(学习笔记)
  3. Ant Design for vue
  4. 按头安利 好看又实用的建筑图标素材看这里
  5. 汉印CP4000照片打印机体验
  6. ToLua 入门07_GameObject
  7. 一场面试过后—移动前端开发
  8. PBR 六 材质参数
  9. 决策树——ID3算法
  10. PDF识别文字、关键字,获取对应坐标,用于插入电子签名