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

    首先,__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.

    略。

  • 相关阅读:
    volume 方式使用 Secret【转】
    查看 Secret【转】
    用 k8s 管理机密信息【转】
    MySQL 如何使用 PV 和 PVC?【转】
    【docker问题】Client.Timeout exceeded while awaiting headers
    PV 动态供给【转】
    回收 PV【转】
    NFS PersistentVolume【转】
    PV & PVC【转】
    IO流中的常见问题
  • 原文地址:https://www.cnblogs.com/mumuliang/p/4053724.html
Copyright © 2011-2022 走看看