C++ 裸函数调用2025 年 5 月 5 日 | 阅读 6 分钟 大家好!今天我们将学习 C++ 中的裸函数调用。我们可能会有疑问,为什么 C++ 中的函数被称为裸函数。在了解它之前,我们应该先了解什么是函数调用? C++ 中的函数调用在 C++ 程序中,激活函数并允许它在我们要求它执行的地方运行的过程称为 C++ 中的函数调用。 C++ 中有两种类型的函数调用。它们是
在此函数调用中,我们分配或传递任何参数给 C++ 程序。这些参数在程序运行中起着至关重要的作用。
在此函数调用中,我们分配或传递任何参数给 C++ 程序。这些参数在程序运行中起着至关重要的作用。 示例文件名:withParameters1. cpp 编码 输入 输出 3628800 is the factorial of 10 示例 文件名:withoutParameters1. cpp 编码 输入 输出 2004310016 is the factorial of 15 裸函数调用当函数使用 naked 属性声明时,不会生成 prolog 或 epilog 代码,从而允许您使用内联汇编器创建自己的独特 prolog/epilog 序列。 裸函数是一项高级功能。它们为您提供了声明一个从 C 或 C++ 以外的上下文调用的函数的选项,允许您对参数位置或寄存器保存做出不同的假设。 中断处理程序等例程就是示例。虚拟设备驱动程序 (VxD) 的创建者会发现此功能特别方便或易于使用。 naked 属性用于指定函数,当为此类函数生成代码时,不包括 prolog 和 epilog。 使用内联汇编器代码,您可以利用此功能创建自己的 prolog/epilog 代码序列。编写虚拟设备驱动程序很好地利用了裸函数。请记住,x64 平台不支持 naked 属性;它仅在 x86 和 ARM 上有效。 语法 裸函数必须使用扩展属性语法和 __declspec 关键字,因为 naked 属性仅影响函数的声明,而不是类型修饰符。 即使函数带有 __force inline 关键字和 naked 属性,编译器也无法为该函数创建内联函数。 如果 naked 属性用于非成员方法定义以外的任何内容,编译器会抛出错误。 示例 只有编译器生成的 prolog 和 epilog 序列的性质受到 naked 属性的影响。 它不影响为调用这些函数而创建的代码。因此,函数指针不能包含 naked 属性,因为它不被视为函数类型的一部分。此外,数据定义不能使用 naked 属性。 规则和限制以下是 C++ 中裸函数调用的规则和限制
示例 编写 prolog/epilog 代码时要记住的想法在创建自己的 prolog 和 epilog 代码序列之前,了解堆栈帧的结构至关重要。了解如何使用 __LOCAL SIZE 符号也很有帮助。 堆栈帧布局此插图显示了可在 32 位函数中使用的典型 prolog 代码 示例 “registers”变量是应保存到堆栈的寄存器列表的占位符,“localbytes”变量指示局部变量在堆栈上所需的字节数。在推送寄存器之后,您可以将任何其他相关数据放到堆栈上。相关的 epilog 代码如下 Epilog 代码堆栈总是变小(从高内存地址到低内存地址)。推送的 ebp 值是基指针 (ebp) 指向的位置。在 ebp-4 处,驻留区开始。通过从 ebp 中减去正确的量来计算 ebp 的偏移量,以便访问局部变量。 局部大小为了在函数 prolog 代码的内联汇编器块中使用,编译器提供了一个名为 __LOCAL SIZE 的符号。在自定义 prolog 代码中,此符号用于在堆栈帧上为局部变量分配空间。 __LOCAL SIZE 的值由编译器设置。它的值由所有用户定义的局部变量和编译器生成的临时变量的总和组成。__LOCAL SIZE 只能作为瞬时操作数,不能在表达式中使用。您不允许更改或重新解释此符号的含义。例如 __LOCAL SIZE 符号在采用独特 prolog 和 epilog 序列的裸函数的 prolog 序列中按如下方式使用 示例 这就是 C++ 语言中裸函数调用的全部内容。 下一主题C++ 中的运算符重载是什么 |
复制省略被定义为一种优化技术,用于避免不必要的对象复制。通常,所有编译器都使用复制省略技术。对于绑定到引用的临时对象,此优化技术不可用。它也是...
阅读1分钟
在本文中,您将了解 C++ 中 Baillie-PSW 素性检验的实现及其示例。Baillie-PSW 素性检验是由 Samuel S. Wagstaff, Jr.、John Selfridge 和 Colin P. L. Bailey 开发的一种概率素性检验。该检验提供了一种精确的方法来...
5 分钟阅读
在基类中声明了关键字 virtual 的成员函数,并在派生类中重新定义(重写)的函数称为虚函数。后期绑定指令指示编译器在运行时执行调用的函数,通过……
阅读 3 分钟
什么是数组?数组是线性数据结构,以线性方式存储相同数据类型的数据或值。数组中存储的值或数据被分配连续的内存。数组可以根据其维度有各种类型,例如一维...
阅读 4 分钟
什么是字符串字面量?匿名字符串[1]或字符串字面量是计算机程序源代码中字符串值的字面量。例如 x = "foo",其中 "foo" 是值为 foo 的字符串字面量,现代计算机语言经常使用带引号的系列...
阅读 3 分钟
什么是 BFS?广度优先搜索 (BFS) 是一种遍历或搜索图的算法。它从给定的顶点开始,在移动到下一级顶点之前探索所有相邻的顶点。BFS 可用于查找两个顶点之间的最短路径...
5 分钟阅读
在本文中,我们将讨论友元函数和虚函数之间的区别。但在讨论它们的区别之前,我们必须了解 C++ 中的友元函数和虚函数。什么是友元函数?在 C++ 编程语言中,友元函数是...
5 分钟阅读
在本文中,我们将讨论如何用不同的方法计算 C++ 中最多一个字符频率为奇数的子字符串的数量。字符串中连续的字符子集或序列称为子字符串。现在有必要确定...
阅读 4 分钟
使用强大的 C++ 编程语言可以轻松进行数据操作和验证。isdigit() 是这样一个方法,它在处理字符数据时非常有帮助。在本文中,我们将详细讨论 isdigit() 函数。我们将检查其语法……
阅读 6 分钟
当我们只需要一种可以在 O(Logn) 时间内处理插入、删除和查找最小值的数据结构时,最小堆就派上用场了。在本文中,我们将介绍如何在 C++ 中实现最小堆。一个完全二叉树,它是一个最小堆或……
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India