当前位置: 首页 > wzjs >正文

中国水土保持与生态环境建设网站网站建设哪家公司便宜

中国水土保持与生态环境建设网站,网站建设哪家公司便宜,广州市财贸建设开发监理网站,公司网站图片传不上去#cpp 1. __stdcall 参数传递顺序:参数从右到左依次压入栈中,这一点和 __cdecl 一样。例如对于函数 int func(int a, int b, int c),调用时参数入栈顺序为 c、b、a。栈清理方式:由被调用函数负责清理栈。在函数返回之前&#xff…

#cpp

1. __stdcall

  • 参数传递顺序:参数从右到左依次压入栈中,这一点和 __cdecl 一样。例如对于函数 int func(int a, int b, int c),调用时参数入栈顺序为 cba
  • 栈清理方式:由被调用函数负责清理栈。在函数返回之前,被调用函数会将之前压入栈的参数从栈中移除。这意味着被调用函数需要知道参数的数量和大小,所以它不适合可变参数函数。
  • 名称修饰:在 Visual C++ 中,函数名会被修饰,通常在函数名前加下划线,后面跟着 @ 符号以及参数的总字节数。例如 int func(int a, int b)(假设 int 为 4 字节),修饰后的名称可能是 _func@8
  • 应用场景:常用于 Windows API 函数,这样可以减少代码重复,因为每个函数自身清理栈,无需调用者处理。

示例代码

#include <iostream>// 使用 __stdcall 调用约定的函数
int __stdcall add(int a, int b) {return a + b;
}int main() {int result = add(1, 2);std::cout << "Result: " << result << std::endl;return 0;
}

2. __fastcall

  • 参数传递顺序:部分参数通过寄存器传递,其余参数从右到左压入栈中。一般来说,前几个较小的参数(如 int 类型)会使用寄存器(如 ECX、EDX)传递,以提高参数传递的效率。
  • 栈清理方式:由被调用函数负责清理栈中剩余的参数。
  • 名称修饰:不同编译器的名称修饰规则不同。在 Visual C++ 中,函数名前会加 @ 符号,后面跟着参数的总字节数。例如 int func(int a, int b) 修饰后的名称可能是 @func@8
  • 应用场景:适用于对性能要求较高的函数,因为通过寄存器传递参数可以减少栈操作,提高函数调用的速度。

示例代码

#include <iostream>// 使用 __fastcall 调用约定的函数
int __fastcall subtract(int a, int b) {return a - b;
}int main() {int result = subtract(5, 3);std::cout << "Result: " << result << std::endl;return 0;
}

3. __thiscall

  • 参数传递顺序__thiscall 主要用于 C++ 类的成员函数。this 指针通过寄存器(通常是 ECX)传递,其他参数从右到左压入栈中。
  • 栈清理方式:如果是普通成员函数,由被调用函数负责清理栈;如果是可变参数的成员函数,由调用者负责清理栈。
  • 名称修饰:和 __cdecl 类似,不同编译器有不同的名称修饰规则。
  • 应用场景:C++ 类的成员函数默认使用 __thiscall 调用约定。

示例代码

#include <iostream>class MyClass {
public:// 成员函数默认使用 __thiscall 调用约定int add(int a, int b) {return a + b;}
};int main() {MyClass obj;int result = obj.add(1, 2);std::cout << "Result: " << result << std::endl;return 0;
}

4. __vectorcall(仅适用于 Visual C++)

  • 参数传递顺序:使用寄存器和栈混合传递参数,部分参数通过寄存器传递,其余参数从右到左压入栈中。它会优先使用寄存器来传递向量类型的参数,以提高性能。
  • 栈清理方式:由被调用函数负责清理栈。
  • 名称修饰:函数名会被修饰,遵循特定的规则。
  • 应用场景:适用于处理向量类型数据且对性能有较高要求的函数。

调用者负责清理栈时之所以可以使用可变参数,主要是因为调用者清楚具体传递了多少个参数,从而能够正确地清理栈空间,下面从可变参数函数的工作原理、栈清理的要求以及调用者和被调用者的信息差异等方面详细解释。

为什么调用者清理就可以使用可变参?

可变参数函数的工作原理

可变参数函数允许在调用时传递数量和类型不确定的参数。在 C 和 C++ 中,常见的可变参数函数有 printf 系列函数,其使用 ... 表示可变参数部分。例如:

#include <stdio.h>// 可变参数函数示例
int sum(int count, ...) {va_list args;va_start(args, count);int result = 0;for (int i = 0; i < count; ++i) {result += va_arg(args, int);}va_end(args);return result;
}

在上述代码中,sum 函数接收一个固定参数 count 表示可变参数的数量,然后使用 va_listva_startva_arg 和 va_end 等宏来处理可变参数。

栈清理的要求

在函数调用过程中,参数会被压入栈中。当函数执行完毕后,需要将这些参数从栈中移除,以恢复栈的原始状态,保证后续的函数调用能够正常进行。为了正确清理栈,必须知道压入栈的参数数量和每个参数的大小。

调用者和被调用者的信息差异

  • 被调用者不清楚参数数量:对于可变参数函数,被调用者(函数本身)在编译时无法确定调用时具体传递了多少个参数。因为可变参数的数量和类型是在调用时动态确定的,所以被调用者无法准确知道需要清理多少栈空间。例如,在 sum 函数中,它只知道有一个固定参数 count,但不知道具体的可变参数数量,因此无法自行清理栈。
  • 调用者知道参数数量:调用者在调用可变参数函数时,明确知道自己传递了多少个参数。例如,在调用 sum 函数时:
int main() {int result = sum(3, 1, 2, 3);return 0;
}

main 函数作为调用者,清楚地知道传递了 3 个可变参数,加上固定参数 count,总共压入了 4 个参数到栈中。因此,调用者可以根据这些信息正确地清理栈。

总结

由于调用者在调用可变参数函数时知道具体传递的参数数量和大小,所以由调用者负责清理栈可以确保栈空间被正确恢复。而被调用者由于无法在编译时确定可变参数的具体情况,不适合负责栈清理工作。这就是为什么调用者清理栈的调用约定(如 __cdecl)可以支持可变参数函数的原因。

http://www.dtcms.com/wzjs/667223.html

相关文章:

  • 海棠网站注册中国最新军事新闻头条今天
  • 租用网站服务器网站开发做账
  • 贵阳学校网站建设网站开发信息
  • 厦门有什么网站设计公司wordpress云主机模板
  • 唐山建网站公司网站建立的步骤是( )
  • 宁波正规站内优化seo潍坊网站建设怎样
  • 做网站主要来源室内设计的软件有哪些
  • 定制做网站技术佛山做网站业务工资
  • 有免费的网站建设网站如何做关键词seo
  • 上海市 建设执业资格注册中心网站汉中住房和城乡建设部网站
  • 云虚拟主机做视频网站wordpress创意主题店铺
  • 高密做网站的公司廊坊网站建设佛山厂商
  • 网站升级正在升级维护恶意网站是怎么实现的
  • 单位网站建设和维护科技小制作怎么做视频网站
  • 东莞建站公司案例全网天下案例庆阳网站设计厂家
  • 网站静态和动态那个好网页视觉设计是什么
  • 做网站要考虑什么阿里巴巴上面可以做网站
  • 关于企业网站建设数据现状分析门户网站建设 总结
  • 建设行业门户网站株洲比较好的广告公司
  • 滕州网站建设哪家好网站开发的语言有什么软件
  • 百度网站安全在线检测it培训机构培训费用
  • 中英文网站源码云南企业展厅设计
  • 备案做电影网站吗网页设计与网站建设主要内容
  • 建设局招标网站中国铁路建设工程招标网站
  • 域名空间网站html5做的网站
  • 红酒网站程序服装网站建设开发语言
  • 站长seo网站推广 排名
  • 呼市賽罕区信息网站做一顿饭工作怎么删除WordPress外链
  • 关于网页制作的网站网站建设四川
  • 建设网站大概要花多少钱企业为什么审计