inline在c++中的作用

作用

内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。 用关键字 inline 放在函数定义的前面即可将函数指定为内联函数,内联函数通常就是将它在程序中的每个调用点上“内联地”展开,假设我们将 max 定义为内联函数:

inline int max(int a, int b)
{
    return a > b ? a : b;
}

则调用:cout << max(a, b) << endl;
在编译时展开为:cout << (a > b ? a : b) << endl; 从而消除了把 max写成函数的额外执行开销。

适用情况

1.一个函数被重复调用;函数只有几行,且不包含for,while,switch语句。
2.内联函数应该放在头文件中定义; 在class中定义的函数,除了虚函数的其他函数都会自动隐式地当成内联函数


// 定义
inline int functionName(int first, int second,...) {/****/};

// 类内定义,隐式内联
class A {
    int doA() { return 0; }         // 隐式内联
}

Effective C++ 30:理解 inline 函数的里里外外

c++17

c++17 inline还可以修饰变量:

  1. inline不能修饰局部变量
  2. inline修饰全局变量后使得所有包含其所在.h文件的编译单元都可以访问到同一个变量,且共享同一块内存。也就是说,它此时就是一个单例。inline static对全局变量的效果与static一样。
  3. inline不能单独修饰成员变量。inline static可以修饰成员变量,它的作用和static单独修饰差不多,但变量可以直接在头文件中初始化
  4. inline可以修饰全局函数和inline修饰全局变量一样,可以使得所有包含其所在.h文件的编译单元都可以访问到同一个函数,且共享同一块内存。inline static对全局变量的效果与static一样。
  5. 当修饰成员函数时,比较清晰的理解方式是,将inline和static看成独立的修饰符。

Header file “example.h”:

#ifndef EXAMPLE_H
#define EXAMPLE_H
 
#include <atomic>
 
// function included in multiple source files must be inline
inline int sum(int a, int b)
{
    return a + b;
}
 
// variable with external linkage included in multiple source files must be inline
inline std::atomic<int> counter(0);
 
#endif

Source file #1:

#include "example.h"
 
int a()
{
    ++counter;
    return sum(1, 2);
}

Source file #2:

#include "example.h"
 
int a() // yet another function with name `a`
{
    ++counter;
    return sum(3, 4);
}
 
int b()
{
    ++counter;
    return sum(5, 6);
}

inline specifier
用c++17的inline变量作为全局配置变量
c++17的inline、static和inline static变量和函数

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++,`static`关键字有多个作用,主要用于存储类别(storage class)和作用域控制。以下是静态关键字的主要用途: 1. 静态存储类别(Storage Class): - **Static Local Variables**: 在函数内部使用`static`声明的变量,其生命周期从定义开始直到程序结束,且仅有一个副本,即使函数被多次调用。这意味着它们只在首次调用时初始化,后续调用时保持不变。 - **Static Member Variables**(Class Variables):类的静态成员变量在整个类实例化期间共享,无论创建了多少个对象,每个对象都有自己的静态成员函数的引用。 - **Static Member Functions**: 类的静态成员函数不依赖于类的任何实例,可以直接通过类名调用。 2. 静态局部作用域: - 当静态变量出现在函数或代码块的开始时,它只在当前作用域可见,每次进入该作用域都会初始化一次。 3. 文件全局(File Scope): - 在头文件(`.h`)声明的静态变量或函数,会在整个程序全局可见,但仅在一个编译单元(translation unit)内初始化一次。 4. 内联函数: - `inline`关键字配合`static`可以提高内联函数的性能,因为编译器可能会在所有调用的地方直接替换内联代码,而不仅仅是`inline`声明的一次。 5. 链表节点的静态属性: - 在某些数据结构如静态链表,静态成员可用于表示链表的头部或尾部元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值