首先,__cdecl,c declaration,C风格声明。或者 c default calling(笔者瞎编的)。(那么问题来了,为什么PASCAL风格被称为std?)

调用约定的内容包括三点:参数出入栈顺序,弹栈工作由谁做,以及产生函数名的方式(renaming?)

1.

在参数入栈顺序上,__cdecl和__stdcall没有区别都是从右往左;

2.

__cdecl既然是c/c++默认,让我们回忆下下stl中的printf这样的变长参数函数,只有调用者才知道实参的情况,因此由调用者去负责恢复栈,大概是比较恰当的。

那么结论来了,__cdecl,指定了由调用者负责弹栈。

接着往下……

调用者负责弹栈,意味着,在最终的可执行代码中,所有调用被指定为__cdecl的方法的地方都会相对__stdcall多生成一段清理栈的代码。

换句话说,如果windows API作为一套已存在的系统/二进制码/或者其他什么,当它在调用应用程序提供的函数的时候,已经没办法知道程序员提供的方法(CALLBACK/WINAPI)要如何清理栈,

更不可能有机会将处理栈的代码新增到这套已经存在的“系统/二进制码/或者其他什么”中,因此必须由函数提供方自行处理栈。

这也就是CALLBACK/WINAPI为什么是__stdcall的原因。

3.

略。

调用约定__cdecl和__stdcall的更多相关文章

  1. C调用约定__cdecl、__stdcall、__fastcall、__pascal分析

    参考原文地址:https://www.cnblogs.com/yenyuloong/p/9626658.html C/C++ 中不同的函数调用规则会生成不同的机器代码,产生不同的微观效果,接下来让我们 ...

  2. 调用约定__cdecl __fastcall与__stdcall

    __cdecl __fastcall与__stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以 ...

  3. x64的调用约定

    在设计调用约定时,x64 体系结构利用机会清除了现有 Win32 调用约定(如 __stdcall.__cdecl.__fastcall._thiscall 等)的混乱.在 Win64 中,只有一个本 ...

  4. x86 x64下调用约定浅析

    x86平台下调用约定 我们都知道x86平台下常用的有三种调用约定,__cdecl.__stdcall.__fastcall.我们分别对这三种调用约定进行分析. __cdecl __cdecl是C/C+ ...

  5. 调用约定__stdcall / __cdecl

    __cdecl与__stdcall这两种调用约定之间的主要差别在于由谁来执行对参数的清理工作. 如果是__cdecl,那么主调函数将负责执行清理工作,如果是__stdcall那被调函数将负责执行清理. ...

  6. 函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal)

    关于函数的调用规则(调用约定),大多数时候是不需要了解的,但是如果需要跨语言的编程,比如VC写的dll要delphi调用,则需要了解. microsoft的vc默认的是__cdecl方式,而windo ...

  7. C++调用约定和名字约定

    C++调用约定和名字约定 转自http://www.cppblog.com/mzty/archive/2007/04/20/22349.html 调用约定:__cdecl __fastcall与 __ ...

  8. __cdecl和__stdcall

    MSVC在编译C/C++程序的时候,默认采用__cdecl调用约定来编译.__stdcall是Win32 API函数的默认调用规约. Calling Convention Internal* MSVC ...

  9. DLL中调用约定和名称修饰(一)

    DLL中调用约定和名称修饰(一) 调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用而建立的一种协议.这种协议规定了该语言的函数中的参数传送方式.参数是否可变和由谁来 ...

随机推荐

  1. 自定义jsp标签

    1.类: package ===============================; import javax.servlet.jsp.JspTagException; import javax ...

  2. c# 远程连接ORACLE数据库

    使用该方法,只需要传入几个必要的参数就可以进行数据库的远程连接测试了,连接成功返回TRUE,失败返回false. 说明: 第一个参数表示你在数据库中的用户,具有可以登录权限的 第二个参数表示用户的密码 ...

  3. TypeScript 中的 "=>" 真的很好用!!!

    class funs { public $scope: IBarPadScope; constructor($scope: IBarPadScope) { this.$scope = $scope; ...

  4. apt-get install *** 出现 软件包***没有提供可供安装的候选者

    今天,重新安装Ubuntu13.04后,在命令行输入 sudo apt-get install aptitude 提示: 软件包 aptitude 没有提供可供安装的候选者 sudo apt-get ...

  5. RTL-SDR + GnuRadio+RFcat 分析、重放无线遥控信号

    0×00 前言 前段时间在<永不消逝的电波(二)HackRF入门:家用无线门铃信号重放> 一文中通过HackRF录制.重放了无线遥控信号,不过一直没来得及对信号进行分析,刚好在国外网站看到 ...

  6. NOIP 考前 KMP练习

    BZOJ 1461 && BZOJ 1729 KMP+BIT 一看就是字符串匹配但是不同的是要按照每个字符的排名情况. 首先对于数字x的排名,那么要判断x前小于x的数的个数,和x前小于 ...

  7. sql 删除表格delete drop truncate 区别(转)

    (1)   DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作.TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把 ...

  8. 项目中 poi 导出 出现html特殊符号的实体 (已解决)

    导出excel 时出现 类似这样的>  符号 , 大概是存到数据库也是这样,然后jsp解析可以解析出来,但是java不认得,需要个人写出解析方法. 废话不说,贴码: /** *转换html特殊符 ...

  9. MySQL - MySQL++在c++11环境下接口设计

    安装官方提供的mysqlconnect后,可以使用mysql++库,在官方的C API上再次做一个c++面向对象封装. 这里mysql++的安装依赖于mysql-connector-c.安装参考:ht ...

  10. Html.RenderPartial与Html.RenderAction

    Html.RenderPartial与Html.RenderAction的区别     Html.RenderPartial与Html.RenderAction这两个方法都是用来在界面上嵌入用户控件的 ...