zoukankan      html  css  js  c++  java
  • 函数的调用规则——简单记忆

    函数的调用规则

    各种调用方式,总是记不住,这里做个笔记(我这里只是速记,具体见文章最下边):

    microsoft的vc默认的是__cdecl方式,而windows API则是__stdcall,如果用vc开发dll给其他语言用,则应该指定__stdcall方式。调用约定可以通过工程设置:Setting...C/C++ Code Generation项进行选择,缺省状态为__cdecl。

    __cdecl
    所谓的C调用规则。按从右至左的顺序压参数入栈,由调用者把参数弹出栈。切记:对于传送参数的内存栈是由调用者来维护的。返回值在EAX中。比如printf。格式为_functionname

    __stdcall
    _stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中。按从右至左的顺序压参数入栈,由被调用者把参数弹出栈。切记:函数自己在退出时清空堆栈,返回值在EAX中。格式为_func@12(后者是参数的总字节数)

    __fastcall
    主要特点就是快,因为它是通过寄存器来传送参数的(实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈)。返回仍然通过EAX。

    __pascal
    这种规则从左向右传递参数,通过EAX返回,堆栈由被调用者清除

    __thiscall
    仅仅应用于"C++"成员函数。this指针存放于CX寄存器,参数从右到左压。thiscall不是关键词,因此不能被程序员指定

    参考:
    http://my.oschina.net/alphajay/blog/6776

  • 相关阅读:
    java fork/join简单实践
    java 中的字符串处理--正则表达式
    那些年,我们追过的java8
    openssl与java(读取加密码的密钥)
    SpringMVC 常用注解的使用和解释
    Spring 常用注解的使用
    java web 一次请求编码设置的过程
    Spring让程序生成程序
    设置session超时的三种方式
    为什么 cookie.getMaxAge() 总是得到 -1 ?
  • 原文地址:https://www.cnblogs.com/findumars/p/3148928.html
Copyright © 2011-2022 走看看