zoukankan      html  css  js  c++  java
  • 调用约定

    C名称修饰规则

         1.对于使用__cdecl调用约定的函数,在函数名称前加一下划线,不考虑参数和返回值。

         2.对于使用__fastcall调用约定的函数,在函数名称前后各加一@符号,后跟参数的长度,不考虑返回值。

               例如 extern “C” int __fastcall Test(int n)的修饰名称为@Test@4.

         3.对于使用 __stdcall 标准调用约定的函数,在函数名称前加一下划线,名称后加一@符号,后跟参数的长度,不考虑返回值。

               例如 extern “C” int __stdcall Test(int n,int m)的修饰名称为 _Test@8

    ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

    C++名称修饰组成部分

    1. 问号前缀
    2. 函数名称或不包括类名的方法名称。构造函数和析构函数具有特别的民称,分别为?0和?1。运算符重载也具有特别的名称,例如new ,delete ,= , +和++的名称分别为?2, ?3, ?4, ?H和?E,我们把这些特别的函数名称简称为特殊函数名。
    3. 如果不是特殊函数名,那么加一个分隔符@
    4. 如果是类的方法,那么由所属类开始依次加上类名和父类名,每个类名后面跟一个@符号,所有类名加好后,再加上一个@符号和字符Q或者S(静态方法)。如果不是类的方法,那么直接加上@符号和字符Y.
    5. 调用约定代码。对于不属于任何类的函数,C调用约定(__cdecl)的代码为A,__fastcall约定的代码为I,__stdcall 的代码为G,对于类方法,调用约定前会加一个字符A,this调用的代码为E.
    6. 返回值编码。 例如字符H代表整数类型的返回值
    7. 参数列表编码,以@符号结束。
    8. 后缀Z。

    ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

    https://msdn.microsoft.com/zh-cn/library/vstudio/46t77ak2(v=vs.110).aspx

    ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

    区别:

    __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共同使用。

    ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

    http://www.xuebuyuan.com/1523077.html

    http://baike.baidu.com/item/__stdcall

    http://www.haodaima.net/art/769201

  • 相关阅读:
    LoadRunner使用记录
    JVM&GC详解
    常用网络操作命令
    IP地址、子网掩码、网络号、主机号、网络地址、主机地址详解
    交换机配置记录
    持续集成与自动化部署---代码流水线管理及Jenkins和gitlab集成
    Git的安装与使用详解
    性能测试---问题记录
    性能测试---实战篇
    c++实用快捷键
  • 原文地址:https://www.cnblogs.com/wenluderen/p/4778106.html
Copyright © 2011-2022 走看看