首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

请教关于C语言形参和实参存储单元的问题?

除了cdecl以外,C中其他常用的调用约定包括stdcall和fastcall,C++中还有一个thiscall(用于调用类的成员函数)。fastcall会使用寄存器来传递一部分参数。...stdcall除了返回时自动清理堆栈以外,与cdecl在使用参数上区别不大。thiscall调用约定使用寄存器传递this指针参数。...pascal调用约定跟stdcall类似,但是参数入栈的顺序是反的。 在cdecl的调用约定下,所有参数从右往左入栈,都要占用存储空间。...另外x86上gcc for linux和windows也是有差别的。...gcc x64在Linux下则按照SystemV的调用约定: 前六个整数或指针类型使用RDI, RSI, RDX, RCX (Linux内核中使用R10),R8,R9浮点数使用XMM0,XMM1,XMM2

1.2K30

5.5 汇编语言:函数调用约定

一般情况下在Win32环境默认遵循的就是STDCALL,而在Win64环境下使用的则是FastCALL,在Linux系统上则遵循SystemV的约定,这里我整理了他们之间的异同点.CDECL:C/C++...前两个参数放入(ECX, EDX),剩下的参数压栈保存.FASTCALL64:被调方平栈,不定参数的函数无法使用,前四个参数放入(RCX, RDX, R8, R9),剩下的参数压栈保存.System V:类Linux...通过以上分析发现_cdecl与_stdcall两者只在参数平衡上有所不同,其余部分都一样,但经过优化后_cdecl调用方式的函数在同一作用域内多次使用,会在效率上比_stdcall髙,这是因为_cdecl...此外,函数使用堆栈来传递其他参数,并在返回之前使用类似于STDCALL约定的方式来平衡堆栈。...#include void __stdcall Show(int x, int y){ printf("%d --> %d \n",x,y);}int __stdcall ShowPrint

22720

linux 编译 c或cpp 文件为动态库 so 文件(最简单直观的模板)

注:在linux上,源文件的函数或方法前,不需要声明 __declspec(dllexport) 在WIn32上才需要。..._stdcall 是StandardCall的缩写,是C++的标准调用方式:所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是this指针。...带有可变参数的函数必须且只能使用_cdecl方式 __cdecl __fastcall与__stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序...1、__stdcall调用约定:函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈。 2、__cdecl是C和C++程序的缺省调用方式。...每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。注意:对于可变参数的成员函数,始终使用__cdecl的转换方式。

5.3K40

调用约定

标准调用约定(stdcall)   标准调用约定的“标准”是由微软为自己的调用约定所起的名称stdcall得来。...stdcall规定: 调用方将所需参数放入栈中 参数放入顺序为从右往左 调用结束后由被调用方清楚参数 要求被调用方从栈中删除参数的特点: 被调用方要完成清除参数的任务,必须清楚的知道栈中有多少个参数,只有在函数参数数量固定不变时才有可能...因此,类似printf这种可变参数的函数无法使用stdcallstdcall的优点: 在每次函数调用之后,不需要通过代码从栈中清除参数,因而能够生成体积稍小、速度稍快的程序。...微软对所有共享库(DLL)文件输出的参数数量固定的函数使用stdcall约定。 x86 fastcall调用约定 fastcall调用约定时stdcall约定的一个变体。...fastcall规定: 能够将最多两个参数存放在寄存器中 传递给函数的前两个参数将分别位于ECX和EDX寄存器中 剩余参数以类似于stdcall约定的方式从右往左放入栈上 C++调用约定(thiscall

81140
领券