zoukankan      html  css  js  c++  java
  • 有关调用约定(调用惯例)

    调用约定(有些书上也叫调用惯例)指的是,函数的调用方和被调用方对于函数如何调用所达成的一个约定。网上关于各种调用约定的说明已经比较多了,我这里主要说一下调用约定的由来。

    参考资料:

    《程序员的自我修养》第十章前两节。

    调用约定的由来


    我们知道,一个应用程序的内存空间中,有栈这个结构来维护函数调用的上下文,在进行一个函数的调用之前,通常都要先push进其参数(这里具体整个栈的变化请参考其他资料),然后被调用的函数内部就能正常的访问这些个参数。

    那么,这里必然需要一个规定,就是规定参数是以什么顺序进来的,以及最后由谁去清理。如果调用者和被调用者没有这种约定,调用者以参数出现的顺序压入,而被调用者仍未调用者是以逆序压入的去读取,很显然就会出错。这里这个约定,就是调用约定,来约定好调用者和被调用者两者如何去共同工作。

    为什么要有不同的调用约定


    那么,为什么要有这么多不同的调用约定呢,比如常见的__stdcall 、__cdecl等。

    这个原因之前有看到说因为不同的编译平台,产生栈的方式不同,而某种调用约定可能无法让编译器完全清空栈,所以增加了调用约定自己去进行清理。

    我始终无法通过上面的的方式去进行理解,发帖询问也没有说是因为这个原因的。

    最终我理解的原因是因为,没有一种调用约定能够在所有场合都很使用,就好像程序设计语言一样,在某些方面某种调用约定好用一些,某些方面另一种又要好一些,因而产生多种调用约定。也就是说,没有什么特别的绝对因素,导致需要增加一种调用约定(也就是原则上来说,一种调用约定已经可以胜任几乎所有情况了,只是为了优化等原因,增加的其他的调用约定)。不知道说的对不对,仅供参考吧,我也希望谁提供给我一个更具有说服力的答案。

    不同调用约定之间的区别


    我先提一句,关于这些区别,资料好多好多。但是关于为什么要有这么些个调用约定,觉得资料很少,难道是我没搜索到?求帮助。

    我觉得区别从很大程度上能反映这个调用约定存在的意义,或者说为什么要增加这个调用约定(和上面为什么要有不同的调用约定似乎已经很接近了),我们可以从这些个区别去反推出为什么要增加这个调用约定,也就能更进一步说明为什么要有不同的调用约定了,是么?这个逻辑有点乱,求理清。

    这些个约定的区别,介绍的文章太多了,提供几个链接吧:

    http://blog.csdn.net/zjwoody/article/details/7887988

    http://blog.163.com/lzf_edu_cn/blog/static/3235151220083123243939/

    总结


    根据windows API的标准,大多数都使用WINAPI这个调用约定(即__stdcall)是比较好的,但是要注意的就是如果使用了不定数参数,那么这个函数即使指定了__stdcall调用约定,编译器也会使用__cdecl调用约定(我没尝试,看别人说的)。

  • 相关阅读:
    Python JPype 在 Win7 下安装与使用
    Visual Studio 2010 下 安装RGiesecke.DllExport
    python简单搭建HTTP Web服务器
    C 语言中 malloc、calloc、realloc 和free 函数的使用方法
    Anaconda 安装 ml_metrics package
    第28章 java反射机制
    第26章 java进制操作
    第27章 java I/O输入输出流
    第25章 网络编程
    第23章 java线程通信——生产者/消费者模型案例
  • 原文地址:https://www.cnblogs.com/monotone/p/2777368.html
Copyright © 2011-2022 走看看