【C++】探索inline关键字:用法、限制与示例代码

2024-09-01 14:44

本文主要是介绍【C++】探索inline关键字:用法、限制与示例代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 相关性质
    • 用法
    • 优点
    • 限制和注意事项
    • inline 函数的定义位置
    • inline 和类成员函数
    • inline 和 constexpr

前言

我们知道:对于C、C++,在编译时遇到函数调用时,编译器会生成一个函数调用的代码,这包括跳转到函数的地址和处理返回值;这个操作会有一定的开销;

inline 关键字 在 C++ 和 C 编程语言中用于指示编译器尝试将函数的代码直接插入到调用它的地方,而不是在程序中生成一个函数调用。这种方式可以减少函数调用的开销,可能提高程序的执行效率(取决于编译器的优化策略)。

inline 通常用于小型、频繁调用的函数;


相关性质

用法

inline int add(int a, int b) {return a + b;
}

在上面的示例中,add 函数被声明为 inline。这意味着编译器在编译过程中会尝试将 add 函数的代码插入到每一个调用 add 函数的地方,而不是生成一个函数调用。


优点

  • 性能提升:消除了函数调用的开销,比如压栈、跳转等,适用于小型的、频繁调用的函数。
  • 减少函数调用开销:特别是在循环或递归中调用小函数时,内联可以显著减少开销。

限制和注意事项

  • 编译器的决定:即使你标记了一个函数为 inline,编译器也不一定会将其内联。编译器有权根据优化策略决定是否真正内联一个函数。
  • 函数体大小inline 一般用于实现简单、短小的函数。复杂的函数如果被内联可能导致代码膨胀,从而影响性能。
  • 代码膨胀:大量的内联函数可能导致代码膨胀,这反而可能降低性能,因为更大的代码可能会影响缓存性能。

inline 函数的定义位置

inline 函数可以在头文件中定义,并在多个源文件中包含。这是因为 inline 函数的定义通常需要在编译时可见,以便编译器能够将其内联。

// header.h
inline int multiply(int a, int b) {return a * b;
}
// file1.cpp
#include "header.h"
// 使用 multiply 函数

inline 和类成员函数

对于类成员函数,inline 也可以使用。这对于实现简单的访问函数或者操作函数特别有用。例如:

class MyClass {
public:inline void setValue(int v) { value = v; }inline int getValue() const { return value; }
private:int value;
};

inline 和 constexpr

constexpr 函数在编译时计算值,并且它们隐式地是内联的

constexpr 函数用于那些在编译时能够计算出值的函数,而 inline 主要是为了减少运行时的开销。

constexpr int square(int x) {return x * x;
}

这篇关于【C++】探索inline关键字:用法、限制与示例代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127237

相关文章

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

SQL Server 中的 WITH (NOLOCK) 示例详解

《SQLServer中的WITH(NOLOCK)示例详解》SQLServer中的WITH(NOLOCK)是一种表提示,等同于READUNCOMMITTED隔离级别,允许查询在不获取共享锁的情... 目录SQL Server 中的 WITH (NOLOCK) 详解一、WITH (NOLOCK) 的本质二、工作

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

Spring AI使用tool Calling和MCP的示例详解

《SpringAI使用toolCalling和MCP的示例详解》SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等... 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结束语

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到