__cdecl __fastcall与__stdcall
__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相关推荐
- __cdecl __fastcall与 __stdcall 调用约定
__cdecl __fastcall与 __stdcall 调用约定: __cdecl __fastcall与 __stdcall,三者都是调用约定(Calling convention),它决定以下 ...
- 论调用约定__stdcall,__cdecl,__fastcall,thiscall,naked call
From: http://blog.vckbase.com/arong/archive/2004/06/09/409.aspx 在C语言中,假设我们有这样的一个函数: int function(int ...
- oracle行级的触发器,Oracle触发器Trigger2行级
create table trigger_t2( id int, name varchar(30), age int ); /* --创建一个before update的触发器-控制每一行,行级 -- ...
- _cdecl、_stdcall 、_fastcall、_thiscall 函数调用方式与区别
几种函数调用方式 __cdecl 是C DECLaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈.被调用 ...
- wndows程序设计之书籍知识与代码摘录-封装一个类似printf的messagebox
//----------------------------------------- //本程序展示了如何实现MessageBoxPrintf函数 //本函数能像printf那样格式化输出 //摘录 ...
- SystemSoftware
title: 系统与软件知识 tags: 系统,软件,小书匠 grammar_cjkRuby: true Copyright (C) @2018 Widic Filename:File-functio ...
- stdcall和cdecl
__cdecl C++ void fun(int a) //默认__cdecl { cout << a; } int main() { fun(3); system(" ...
- 【转】调用约定__cdecl、__stdcall和__fastcall的区别
什么是调用约定 函数的调用约定,顾名思义就是对函数调用的一个约束和规定(规范),描述了函数参数是怎么传递和由谁清除堆栈的.它决定以下内容:(1)函数参数的压栈顺序,(2)由调用者还是被调用者把参数弹出 ...
- __stdcall和__cdecl的区别
__stdcall和__cdecl是两种函数名字修饰.(注意是连续的两个下划线) Windows上 windows上不管是C还是C++,默认使用的都是__stdcall方式. 不论__stdcall还 ...
最新文章
- 基于python实现opencv视频去抖动
- 通俗易懂:贪心算法(一):分配问题 (力扣455分发饼干 和135分发糖果)
- python版trace命令显示归属地
- php通配符是什么,通配符*和?有什么区别
- Url ReWriting
- Nodejs - 如何用 eventproxy 模块控制并发
- pytorch张量_PyTorch张量-详细概述
- 高质量的C/C++编程(2)----程序员必看系列
- AMOS分析技术(导航页)
- C语言版:二叉树叶子结点和非叶子结点求法
- 2021最新Java JDK1.8的安装教程
- Android studio 简易流式布局
- STM32Cube工具学习笔记(一)Cube配置
- 齐次坐标 (Homogeneous Coordinate)
- 用openAI写个js的排序算法(快速排序算法)
- 直流电源线缆 高速电缆 分类
- 2020年最新一二三线互联网公司出炉,附校招和社招薪资行情
- [统计学笔记] 必须要掌握的统计学基本概念和术语(更新中)
- 旅游定制服务|基于SSM实现旅游个性化定制网站平台
- 零基础多图详解图神经网络(GNN/GCN)【论文精读】
热门文章
- 020.2.2 runtime类
- docker 2375 vulnerability and self-signatuer certifications
- 安卓开发遇到Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
- 加解压开源组件-SharpZipLib
- django 组件架构图
- 基于重力补偿的 PD 控制
- 牛客小白赛190615场
- select,InnoDB为啥会阻塞insert?
- MySQL中优化sql语句查询常用的30种方法
- Xcode 7中http通信出现如下错误