开发者社区> 问答> 正文

__cdecl与__stdcall概念中的调用者和被调用者是什么意思?

我只学过C入门,只做过课后习题,最近刚学windows下的C。
但书上第一个程序我就看不懂了

int WINAPI WinMain()
这里的WINAPI我从来没见过这种用法,网上查了下其实是指定__cdecl或__stdcall等这样的函数调用约定,但即使是看了大篇文章后我还是不懂,主要是这些话:

不论__stdcall还是__cdecl函数参数都是从右向左入栈的,并且由调用者完成入栈操作。对于__stdcall方式被调用者自身在函数返回前清空堆栈;而__cdecl则由调用者维护内存堆栈,所以调用者函数生成的汇编代码比前一种方式长。
我想知道上述的调用者/被调用者是人(我自己)还是函数?这些入栈/清空堆栈的操作指的是不是要在申请动态内存后要记得free()掉?不然指的是什么?

展开
收起
a123456678 2016-06-07 18:47:40 2183 0
1 条回答
写回答
取消 提交回答
  • 你都已经查到 __stdcall这一步了,再往下多查一步不就知道了么。

    调用者(caller)和被调用者(callee)都是指函数。入栈清栈指的是函数调用参数传递的方式。清栈职责在caller这边,意思就是:

    foo(123);
    转换成汇编是:

    push 123;
    call foo;
    add $4,%esp; #将Stack Pointer %esp 加4即是清栈

              #4表示32位下4个字节一个word

    如果职责在callee那边,上面最后一行就移到foo中:

    foo:
    # do something
    add $4,%esp
    ret
    后一种方式一个函数只能接受固定个数的参数,因为编译时就需要确定 add x,%esp中x到底是几。

    哦,对了,这些都是编译器的行为,程序员根本不需要关心。

    2019-07-17 19:30:45
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载

相关实验场景

更多