这些是什么?我作为开发人员如何影响这些?
相关:
What are the different calling conventions in C/C++ and what do each mean?
答案 0 :(得分:10)
调用约定描述了某些内容可能调用另一个函数的方式。这需要将参数和状态传递给另一个函数,以便它可以正确执行和返回控制。完成此操作的方式必须标准化并指定,以便编译器知道如何命令参数供被调用的远程函数使用。有几种标准的调用约定,但最常见的是 fastcall
, stdcall
和 cdecl
通常,术语 自定义调用约定 有点用词不当,指的是以下两种情况之一:
非标准调用约定或未广泛使用的约定(例如,如果您从头开始构建体系结构)。
编译器/链接器可以执行的特殊优化,它使用一次性调用约定来提高性能。
在后一种情况下,这会导致一些否则将被压入堆栈的值存储在寄存器中。编译器将尝试根据代码在代码中的使用方式做出此决定。例如,如果参数将用作循环索引的最大值,以便将索引与每次迭代的最大值进行比较以查看是否应该继续,那么将其转换为注册
如果执行优化,通常会减少代码大小并提高性能。
作为开发者,我是如何受到这些影响的?
从您作为开发人员的角度来看,您可能并不关心;这是一种自动发生的优化。
答案 1 :(得分:1)
在调用函数时,每种语言都有一个约定,它将在寄存器变量和堆栈中传递哪些参数,以及如何返回返回值。
有时会使用与标准惯例不同的约定,这被称为自定义调用约定。
这在不同语言之间进行互操作时最常见。例如,C和Pascal关于如何传递参数有不同的约定。从C的角度来看,Pascal调用约定可以称为自定义调用约定。
答案 2 :(得分:1)
我认为你真的不需要关心。
正常的调用约定类似于__stdcall和__fastcall。它们确定如何将调用签名转换为堆栈布局,谁(调用者或被调用者)负责保存和恢复寄存器等。例如,__ fastcall应该使用更多寄存器,其中__stdcall将使用更多堆栈。
自定义调用约定专门针对特定功能及其使用方式进行了优化。它们只发生在IIRC,用于特定模块本地的功能。这就是编译器如何知道如何使用它,以及你如何知道没有外部调用者需要能够指定约定。
基于此,您的编译器将在适当的时候自动使用它们,您的代码运行速度会稍快一点,并且/或者占用的空间会稍微减少,但您实际上并不需要担心它。
答案 3 :(得分:0)
除非您直接操作堆栈或编写引用局部变量的内联汇编,否则它不会影响您。或者,如果您与使用不同调用约定链接的库进行交互
它是什么:大多数编译器都使用标准的调用约定,例如cdecl,其中函数参数按特定顺序被推送到堆栈等。