__cdecl __fastcall与__stdcall

__cdecl __fastcall与__stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以及产生函数修饰名的方法。
1、__stdcall调用约定:函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈。
2、_cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。注意:对于可变参数的成员函数,始终使用__cdecl的转换方式。
3、__fastcall调用约定:它是通过寄存器来传送参数的(实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈)。
4、thiscall仅仅应用于"C++"成员函数。this指针存放于CX寄存器,参数从右到左压。thiscall不是关键词,因此不能被程序员指定。

5、nakedcall采用1-4的调用约定时,如果必要的话,进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器,退出函数时则产生代码恢复这些寄存器的内容。naked call不产生这样的代码。naked call不是类型修饰符,故必须和_declspec共同使用。

cdecl 是 C 语言的调用方式,函数参数从右到左求值,然后入栈,参数由调用方负责清理,传多少参数其实都无所谓的,于是就支持所谓的可变长度的参数;stdcall 是 C++ 的调用方式,参数从右到左求值,入栈,由被调用方处理参数,所以参数个数类型都必须匹配;pascal 是对 PASCAL 函数的调用方式,参数自左向右求值,其他类似于 stdcall;而 fastcall 的情况忽略。

__cdecl __fastcall与__stdcall相关推荐

  1. __cdecl __fastcall与 __stdcall 调用约定

    __cdecl __fastcall与 __stdcall 调用约定: __cdecl __fastcall与 __stdcall,三者都是调用约定(Calling convention),它决定以下 ...

  2. 论调用约定__stdcall,__cdecl,__fastcall,thiscall,naked call

    From: http://blog.vckbase.com/arong/archive/2004/06/09/409.aspx 在C语言中,假设我们有这样的一个函数: int function(int ...

  3. oracle行级的触发器,Oracle触发器Trigger2行级

    create table trigger_t2( id int, name varchar(30), age int ); /* --创建一个before update的触发器-控制每一行,行级 -- ...

  4. _cdecl、_stdcall 、_fastcall、_thiscall 函数调用方式与区别

    几种函数调用方式 __cdecl 是C DECLaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈.被调用 ...

  5. wndows程序设计之书籍知识与代码摘录-封装一个类似printf的messagebox

    //----------------------------------------- //本程序展示了如何实现MessageBoxPrintf函数 //本函数能像printf那样格式化输出 //摘录 ...

  6. SystemSoftware

    title: 系统与软件知识 tags: 系统,软件,小书匠 grammar_cjkRuby: true Copyright (C) @2018 Widic Filename:File-functio ...

  7. stdcall和cdecl

    __cdecl C++ void fun(int a)   //默认__cdecl {  cout << a; } int main() {  fun(3);  system(" ...

  8. 【转】调用约定__cdecl、__stdcall和__fastcall的区别

    什么是调用约定 函数的调用约定,顾名思义就是对函数调用的一个约束和规定(规范),描述了函数参数是怎么传递和由谁清除堆栈的.它决定以下内容:(1)函数参数的压栈顺序,(2)由调用者还是被调用者把参数弹出 ...

  9. __stdcall和__cdecl的区别

    __stdcall和__cdecl是两种函数名字修饰.(注意是连续的两个下划线) Windows上 windows上不管是C还是C++,默认使用的都是__stdcall方式. 不论__stdcall还 ...

最新文章

  1. 基于python实现opencv视频去抖动
  2. 通俗易懂:贪心算法(一):分配问题 (力扣455分发饼干 和135分发糖果)
  3. python版trace命令显示归属地
  4. php通配符是什么,通配符*和?有什么区别
  5. Url ReWriting
  6. Nodejs - 如何用 eventproxy 模块控制并发
  7. pytorch张量_PyTorch张量-详细概述
  8. 高质量的C/C++编程(2)----程序员必看系列
  9. AMOS分析技术(导航页)
  10. C语言版:二叉树叶子结点和非叶子结点求法
  11. 2021最新Java JDK1.8的安装教程
  12. Android studio 简易流式布局
  13. STM32Cube工具学习笔记(一)Cube配置
  14. 齐次坐标 (Homogeneous Coordinate)
  15. 用openAI写个js的排序算法(快速排序算法)
  16. 直流电源线缆 高速电缆 分类
  17. 2020年最新一二三线互联网公司出炉,附校招和社招薪资行情
  18. [统计学笔记] 必须要掌握的统计学基本概念和术语(更新中)
  19. 旅游定制服务|基于SSM实现旅游个性化定制网站平台
  20. 零基础多图详解图神经网络(GNN/GCN)【论文精读】

热门文章

  1. 020.2.2 runtime类
  2. docker 2375 vulnerability and self-signatuer certifications
  3. 安卓开发遇到Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
  4. 加解压开源组件-SharpZipLib
  5. django 组件架构图
  6. 基于重力补偿的 PD 控制
  7. 牛客小白赛190615场
  8. select,InnoDB为啥会阻塞insert?
  9. MySQL中优化sql语句查询常用的30种方法
  10. Xcode 7中http通信出现如下错误