- 浏览: 467468 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (470)
- 前言 (1)
- 【sys】centos6.2 (51)
- 【sys】shell (8)
- 【sys】yum (1)
- software (6)
- 【tec】ruby (16)
- 【tec】rails (35)
- 【tec】rails路由 (2)
- 【tec】rails部署 (10)
- 【tec】rails优化 (6)
- 【tec】rails测试 (11)
- 【tec】php (45)
- 【tec】android (1)
- 【tec】ios (125)
- 【data】mysql (11)
- web (6)
- 【life】文学与提升 (2)
- life (36)
- 【life】怀念 (1)
- 【web】nginx (5)
- 【web】网络与安全 (4)
- 工作随笔 (1)
- 【software】svn (5)
- 【script】jquery (10)
- powerEdge (2)
- 杂七杂八 (5)
- 【sys】ubuntu (9)
- 【sys】windows (4)
- 【tec】java (1)
- 【tec】html (3)
- 【tec】c++ (38)
- 【tec】汇编 (1)
- 【data】数据库 (1)
- 【exchange 】学术交流 (1)
- 【tec】域名空间 (1)
- 【tec】编程先知 (1)
- 【tec】网站建设 (7)
- 【sys】mac (24)
- 【sys】seo (1)
- 【tec】wp (1)
- 【software】git (4)
最新评论
-
fireDragonpzy:
呵呵 貌似我网站上的有更新 你从那里看看 这个博客维护的不及时 ...
牛人经典语录 -
Peppermintchz:
还真这么2过啊!!好怀念啊
牛人经典语录 -
fireDragonpzy:
chenhong53 写道你好,我想问一下,能不能给一组精灵数 ...
cocos2d-x事件触发的优先级 -
chenhong53:
你好,我想问一下,能不能给一组精灵数组中的精灵添加触屏优先级, ...
cocos2d-x事件触发的优先级 -
fireDragonpzy:
dreamstar1020 写道谢谢庞兄指点,写的很详细,谢谢 ...
致:上海郑兄(虚拟主机-web服务器搭建)
几种函数调用方式 __cdecl 是C Declaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。 _stdcall 是StandardCall的缩写,是C++的标准调用方式:所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是this指针。这些堆栈中的参数由被调用的函数在返回后清除,使用的指令是 retnX,X表示参数占用的字节数,CPU在ret之后自动弹出X个字节的堆栈空间。称为自动清栈。函数在编译的时候就必须确定参数个数,并且调用者必须严格的控制参数的生成,不能多,不能少,否则返回后会出错。 PASCAL 是Pascal语言的函数调用方式,也可以在C/C++中使用,参数压栈顺序与前两者相反。返回时的清栈方式与_stdcall相同。 _fastcall是编译器指定的快速调用方式。由于大多数的函数参数个数很少,使用堆栈传递比较费时。因此_fastcall通常规定将前两个(或若干个)参数由寄存器传递,其余参数还是通过堆栈传递。不同编译器编译的程序规定的寄存器不同。返回方式和_stdcall相当。 _thiscall 是为了解决类成员调用中this指针传递而规定的。_thiscall要求把this指针放在特定寄存器中,该寄存器由编译器决定。VC使用ecx,Borland的C++编译器使用eax。返回方式和_stdcall相当。 _fastcall 和 _thiscall涉及的寄存器由编译器决定,因此不能用作跨编译器的接口。所以Windows上的COM对象接口都定义为_stdcall调用方式。 C中不加说明默认函数为_cdecl方式(C中也只能用这种方式),C++也一样,但是默认的调用方式可以在IDE环境中设置。 带有可变参数的函数必须且只能使用_cdecl方式,例如下面的函数: int printf(char * fmtStr, ...); int scanf(char * fmtStr, ...); */几种调用约定的区别 编辑本段 几种调用约定的区别 __cdecl __fastcall与 __stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以及产生函数修饰名的方法。 1、__stdcall调用约定:函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈, 2、_cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。注意:对于可变参数的成员函数,始终使用__cdecl的转换方式。 3、__fastcall调用约定:它是通过寄存器来传送参数的(实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈)。 4、thiscall仅仅应用于"C++"成员函数。this指针存放于CX寄存器,参数从右到左压。thiscall不是关键词,因此不能被程序员指定。 5、nakedcall采用1-4的调用约定时,如果必要的话,进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器,退出函数时则产生代码恢复这些寄存器的内容。naked call不产生这样的代码。naked call不是类型修饰符,故必须和_declspec共同使用。 编辑本段 名字修饰约定 1、修饰名(Decoration name):"C"或者"C++"函数在内部(编译和链接)通过修饰名识别 2、C编译时函数名修饰约定规则: __stdcall调用约定在输出函数名前加上一个下划线前缀,后面加上一个"@"符号和其参数的字节数,格式为_functionname@number,例如 :function(int a, int b),其修饰名为:_function@8 __cdecl调用约定仅在输出函数名前加上一个下划线前缀,格式为_functionname。 __fastcall调用约定在输出函数名前加上一个"@"符号,后面也是一个"@"符号和其参数的字节数,格式为@functionname@number。 编辑本段 设置方法 1 可以直接在代码中写 __cdecl 等调用约定 2 在MS-VC++6.0中,调用约定也可以通过工程设置:Setting...\C/C++ \Code Generation项进行选择,缺省状态为__cdecl。名字修饰约定。
摘自:http://baike.baidu.com/view/1280676.htm
发表评论
-
C++ 虚函数表解析 转
2013-05-29 09:09 830详情请参考:【Software Myzone】:http:// ... -
不玩设计模式的程序员不是好程序员
2013-05-02 09:40 666详情请参考:【Software Myzone】:http:// ... -
C/C++中的结构体
2012-11-07 09:02 766详情请参考:【Software Myzone】:http:// ... -
C++数组的存储|C++数组所占内存空间
2012-09-17 19:45 753详情请参考:【Software Myzone】:http:// ... -
C++中引用传递与指针传递区别(进一步整理)
2012-09-04 13:37 833详情请参考:【Software MyZone】:http:// ... -
提高C程序效率的方法
2012-08-14 18:21 455本文为firedragonpzy原创,转载务必在明显处注明: ... -
const char*, char const*, char*const的区别
2012-08-13 13:50 868const char*, char const*, char* ... -
“tr”和字符串类型的string str = "tr"对比
2012-08-11 16:11 961本文为firedragonpzy原创,转载务必在明显处注明: ... -
c++ sizeof使用
2012-08-11 15:22 863http://dev.yesky.com/143/256364 ... -
typedef分析(针对ccColor4B)
2012-08-09 19:34 1256本文为firedragonpzy原创, ... -
c++中的变量
2012-08-09 17:24 778本文为firedragonpzy原创, ... -
C++引用与指针的比较
2012-08-03 14:09 772引用是C++中的概念,初学者容易把引用和指针混淆一起。 ... -
C/C++中函数指针的含义
2012-08-01 15:54 985函数存放在内存的代 ... -
vs2010惯用快捷键设置
2012-07-27 19:54 992首先介绍下快捷键设置入口:工具->选项->环境 ... -
c++基础知识(十一)文件的复制
2012-07-25 08:49 803#include <cstdio> #inc ... -
字符编码笔记:ASCII,Unicode和UTF-8
2012-07-18 14:04 10001. ASCII码 我们知道,在 ... -
c++基础知识(十)学习C++静态成员注意事宜
2012-07-14 17:49 873C++中的一个类中还可以 ... -
c++ site
2012-07-14 09:45 790c++,含有内核的讲解:http://bdxnote.blog ... -
c++进阶(一)C语言条件编译及编译预处理阶段
2012-07-14 09:09 1388一、C语言由源代码生成的各阶段如下: C源程序->编译 ... -
c++基础知识(八)C/C++中修饰符const、extern、static、volatile的用法
2012-07-13 15:02 11881.const的用法: 为什 ...
相关推荐
几种函数调用的方式,关于函数调用的一些东西,选自 Hacker Disassembling Uncovered 里的一节 ,精简版..
根据给定的文件信息,我们可以深入探讨C/C++中几种主要的函数调用方式:__cdecl、__stdcall和__fastcall,以及C++特有的thiscall。 ### __cdecl `__cdecl`,即“C声明”或“C default”,是C/C++中默认的调用约定...
### Visual C++中函数调用方式浅探 在Visual C++环境下进行软件开发时,了解不同的函数调用约定(calling conventions)对于优化程序性能、理解编译器行为以及避免潜在的错误至关重要。本文将深入探讨Visual C++中...
本文将详细讲解C/C++中常见的几种函数调用方式,包括stdcall、cdecl、fastcall、thiscall以及naked call。 1. stdcall调用方式: stdcall,也称为Pascal调用方式,主要用于Windows API函数。在stdcall中,参数按从...
类中函数调用通常涉及以下几种情况: 1. **非静态成员函数调用**:这是最常见的函数调用形式,需要通过类的实例(对象)来调用,因为这些函数可能访问或修改类的私有或保护成员。 2. **静态成员函数调用**:静态...
文档中提到了几种常见的调用约定: 1. stdcall调用约定:也被称为pascal调用约定,Microsoft C++系列编译器中常用。其特点是参数从右向左压栈,函数自己负责清理堆栈。函数名经过特定的命名修饰,通常在函数名前加...
### C++箴言:避免析构函数调用虚函数 #### 概述 在C++编程中,理解和遵循良好的设计模式对于确保程序的稳定性和可维护性至关重要。其中一个经常被提及的原则是“避免在析构函数中调用虚函数”。这一原则在C++语言...
这通常通过以下几种方式实现: 1. **预编译插桩(Bytecode instrumentation)**:利用Java代理(Java Agent)或者ASM、ByteBuddy等库修改字节码,在函数调用前后插入记录代码。 2. **运行时拦截(Runtime ...
首先,DLL分为几种类型: 1. Non-MFC DLL:这类DLL不依赖于MFC(Microsoft Foundation Classes)库,而是直接使用C语言编写,输出的函数通常采用标准C接口,因此可以被非MFC或MFC应用调用。它们的函数声明通常使用`...
以下是关于MATLAB自定义函数调用的五种方法的详细说明: 1. **命令/函数文件 + 函数文件**: 在这种方法中,自定义函数被编写在一个独立的`.m`文件中,例如`mylfg.m`。函数名与文件名相同,如`function y = mylfg...
在Windows编程中,有几种常见的API调用方式: 1. **直接调用**:直接在代码中使用函数声明和调用,例如: ```c++ #include int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, ...
根据函数调用在程序中的位置和作用,有三种调用方式:1) 函数调用语句,独立于其他语句,不关心函数是否返回值,例如`printf("%d",a)`;2) 函数表达式,函数调用作为另一个表达式的一部分,如`c=max(a,b)`;3) 函数...
在标题"函数直接调用几种方法_loki_grandmotherxmb_函数直接调用_元编程_"中,我们看到了几个关键概念:函数直接调用、洛基库(Loki)、元编程以及"grandmotherxmb",这可能是一个特定的代码示例或库的作者名称。...
在编程领域,递归函数是一种强大的工具...总的来说,理解和计算递归函数调用次数是编程中的重要技能,它涉及到算法分析、性能优化和问题解决策略等多个方面。通过熟练掌握递归,程序员能更好地应对各种复杂的编程挑战。
C语言函数调用汇编语言函数是软件开发中的一种常见技术。本文将对C语言函数调用汇编语言函数进行总结,详细介绍相关知识点。 一、C语言函数调用汇编语言函数的定义 C语言函数调用汇编语言函数是指在C语言程序中...
以下将详细介绍标题和描述中提到的七种函数定义方法: 1. **函数文件+调用命令文件**: 在这种定义方式下,我们需要创建一个`.m`文件,比如`my_sum.m`,其中包含自定义函数的代码。例如,为了实现一个求和功能,...
综上所述,C语言的教学过程中,函数调用问题的探讨涵盖了函数定义、函数调用方式、库函数调用以及函数调用在实际问题中的应用等多个方面。通过教学案例的分析和教学方法的探讨,可以更有效地帮助学生掌握函数调用的...