zoukankan      html  css  js  c++  java
  • 调用惯例

    调用惯例 出栈方 参数传递 名字修饰
    cdecl 函数调用方 从右至左的顺序压参数入栈 下划线+函数名
    stdcall 函数本身 从右至左的顺序压参数入栈 下划线+函数名+@+参数字节数,如函数int func(int a, double b)的修饰名是_func@12
    fastcall 函数本身 头两个DWORD(4字节)类型或者占用更少字节的参数被放入寄存器,其他剩下的参数按从右到左的顺序压入栈 @+函数名+@+参数的字节数
    pascal 函数本身 从左至右的顺序压参数入栈 较为复杂,参加pascal文档

    此外,不少编译器还提供一种称为naked call的调用惯例,这种调用惯例用在特殊的场合,其特点是编译器不产生任何保护寄存器的代码,故称naked call。

    对c++而言,以上几种调用惯例的名字修饰策略都略有所改变,因为c++支持函数重载以及命名空间和成员函数等等,因此实际上一个 函数名可以对应多个函数定义,那么上面提到的名字修饰策略显然无法区分各个不同同名函数定义的。所以c++有自己更加复杂的名字修饰策略。最后,c++还有自己一种特殊的调用惯例,称为thiscall,专门用于类成员函数的调用,其特点随编译器不同而不同,在vc里是将this指针存放于eax寄存器,参数从右到左压栈,而对于gcc、thiscall和cdecl完全一样,只是将this看作是函数的第一参数。

  • 相关阅读:
    CString与 char *之间的转换
    linux命令行打开图片
    CentOS7 NFS配置
    vs2010 Visula C++ 把CString 转换为string 类型
    1>LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
    mount 命令
    Centos7.0 Vmware10.0.3 网络桥接配置
    Notepad++ 连接远程 FTP 进行文件编辑
    安装PHP的mongodb驱动速记
    CentOS上安装MongoDB速记
  • 原文地址:https://www.cnblogs.com/fr-ruiyang/p/13714114.html
Copyright © 2011-2022 走看看