C++ 中的内联函数
本文将讨论 C++ 中的 inline
函数、如何实现它们以及使用它们的优缺点。
为什么在 C++ 中使用 inline
函数
每当我们执行程序时,CPU 都会在函数调用之后存储指令的内存地址;它将参数复制到堆栈上并将控制权转移到指定的函数。
然后 CPU 执行代码,返回特定内存位置的值,并再次返回到被调用的函数。如果大部分时间都花在切换而不是执行功能上,它可能会产生额外的开销。
这种开销在执行复杂的 CPU 密集型任务的大型函数中是微不足道的,因为大部分时间只花在执行上。
但是,当我们有许多只执行基本任务的小功能时,这种开销会变得很大。大部分时间都花在切换上,几乎没有时间花在执行上。
因此,当我们有许多小功能以节省切换时间并提高效率时,内联
的概念会很方便。
每当在编译时在代码中将任何函数声明为内联
时,它不会在函数调用时分配地址,而是复制整个函数代码并将其放在该位置。
语法:
inline return_type function_name(arguments)
{
...
}
inline
函数只是对编译器的请求,因此编译器可以在以下情况下忽略它:
- 函数有静态变量;
- 函数有
goto
或switch
语句; - 函数是递归的;
- 函数有循环。
inline
的概念通常与类一起使用。
在 C++ 中实现内联
函数
示例代码:
#include <iostream>
using namespace std;
class myClass
{
int a,b;
public:
void sum();
};
inline void myClass::sum()
{
cout << "Enter first value:";
cin >> a;
cout << "Enter second value:";
cin >> b;
cout<<"Sum of two numbers is "<<a+b<<endl;
}
int main()
{
cout << "Program using inline function\n";
myClass obj;
obj.sum();
}
在上面的代码中,我们在定义函数时将函数声明为内联
,因为在类外部而不是在类内部编写实际的内联
函数定义是一种很好的编程习惯。
然而,一个类中的函数定义默认是一个 inline
函数定义,即使没有使用 inline
关键字。
输出:
Program using inline function
Enter first value:12
Enter second value:13
Sum of two numbers is 25
在 C++ 中将 constructor
和 destructor
实现为 inline
函数
使用上面的例子并在定义类的同时在类之外制作 inline
函数,我们甚至可以将 constructor
和 destructor
制作为 inline
。
示例代码:
#include <iostream>
using namespace std;
class myClass
{
int a,b;
public:
myClass();
~myClass();
void sum();
};
inline myClass::myClass()
{
a = 100;
b = 200;
}
inline myClass::~myClass()
{
cout<<"destroying the object\n";
}
inline void myClass::sum()
{
cout<<"Sum of two numbers is "<<a+b<<endl;
}
int main()
{
cout << "Program using inline function\n";
myClass obj;
obj.sum();
}
输出:
Program using inline function
Sum of two numbers is 300
destroying the object
在 C++ 中实现 inline
函数的优缺点
现在,让我们看看实现 inline
函数的一些优点:
- 减少函数调用的开销。
- 它节省了函数返回调用的开销。
- 节省入栈和出栈变量的开销。
虽然有用,但它也有一些缺点:
- 如果我们使用过多的
inline
函数,二进制可执行文件的大小可能会变大,因为这里会发生相同代码的重复。 - 内联函数过多会降低指令的缓存命中率,从而影响指令从缓存内存到主内存的速度。
- 在代码大小比速度更重要的嵌入式系统中,
内联
函数将无济于事。 - 可能会出现抖动,这会降低计算机的内存性能。
相关文章
在 C++ 中通过掷骰子生成随机值
发布时间:2023/04/09 浏览次数:169 分类:C++
-
本文解释了如何使用时间因子方法和模拟 C++ 中的掷骰子的任意数方法生成随机数。了解它是如何工作的以及它包含哪些缺点。提供了一个 C++ 程序来演示伪数生成器。
在 C++ 中使用模板的链表
发布时间:2023/04/09 浏览次数:158 分类:C++
-
本文解释了使用模板在 C++ 中创建链表所涉及的各个步骤。工作程序演示了一个链表,该链表使用模板来避免在创建新变量时声明数据类型的需要。
在 C++ 中添加定时延迟
发布时间:2023/04/09 浏览次数:142 分类:C++
-
本教程将为你提供有关在 C++ 程序中添加定时延迟的简要指南。这可以使用 C++ 库为我们提供的一些函数以多种方式完成。
在 C++ 中创建查找表
发布时间:2023/04/09 浏览次数:155 分类:C++
-
本文重点介绍如何创建查找表及其在不同场景中的用途。提供了三个代码示例以使理解更容易,并附有代码片段以详细了解代码。
如何在 C++ 中把字符串转换为小写
发布时间:2023/04/09 浏览次数:63 分类:C++
-
介绍了如何将 C++ std::string 转换为小写的方法。当我们在考虑 C++ 中的字符串转换方法时,首先要问自己的是我的输入字符串有什么样的编码
如何在 C++ 中确定一个字符串是否是数字
发布时间:2023/04/09 浏览次数:163 分类:C++
-
本文介绍了如何检查给定的 C++ 字符串是否是数字。在我们深入研究之前,需要注意的是,以下方法只与单字节字符串和十进制整数兼容。
如何在 c++ 中查找字符串中的子字符串
发布时间:2023/04/09 浏览次数:65 分类:C++
-
本文介绍了在 C++ 中检查一个字符串是否包含子字符串的多种方法。使用 find 方法在 C++ 中查找字符串中的子字符串
如何在 C++ 中把字符串转换为 Char 数组
发布时间:2023/04/09 浏览次数:107 分类:C++
-
本文介绍了在 C++ 中把字符串转换为 char 数组的多种方法。使用 std::basic_string::c_str 方法将字符串转换为 char 数组