首页 > 其他分享 >内联函数

内联函数

时间:2023-11-09 16:11:52浏览次数:30  
标签:头文件 函数 int ++ n1 内联

先看一段代码:

  

问题:

  进出 getMax 的开销,比 getMax 函数本身的开销还要大

如果使用宏:

1 #define GETMAX(a,b) ((a)>(b)?(a):(b))
2 
3 int main() {
4     int n1 = GETMAX(1, 2);  // 等价于直接写 int n1 = (1)>(2)?(1):(2);
5     return 0;
6 }

宏跟函数的区别:宏是替换;如果使用宏,相当于编译器把宏里面规定的代码直接放到了 使用宏的那里

 

使用 宏 的问题,举个例子:

 1 #define GETMAX(a,b) ((a)>(b)?(a):(b))
 2 
 3 int main() {
 4     int a = 10;
 5     int n1 = GETMAX(a++, 2);
 6     // 上一行相当于 int n1 = ((a++)>(2)?(a++):(2));
 7     cout << "a = " << a << endl;
 8     cout << "n1 = " << n1 << endl;
 9     return 0;
10 }

res:

  

原代码看似只执行了一次 a++,a 应该等于 11,但是运行结果显示 a = 12.

这是因为int n1 = GETMAX(a++,2);等价于写int n1 = ((a++)>(2)?(a++):(2));

第一次比较的时候,比较的是 a = 10 和 2,随后 a 进行了一次自增变为 11. 然后 n1 被赋值为 11.

n1 被赋值之后,a 又进行了一次自增(第二个 a++ 的位置),此时 a 变为了 12.

 

既利用了函数传参,又不像函数调用那样的代价:内联函数

内联函数语法:在定义函数前加 inline

1 inline int getMax(int a, int b) {
2     return a > b ? a : b;
3 }

 

内联函数 通常放在头文件;

如果一个头文件中定义(不是声明)了一个普通函数(不是内联函数),然后这个.h 头文件分别被好几个.cpp 文件包含,那么编译代码时不用过,原因是头文件的普通函数被这几个.cpp重定义了;

而头文件中定义内联函数,然后这个头文件被好几个.cpp 文件包含,就不会出错,因为.cpp 文件在使用内联函数时,相当于直接把内联函数的代码放到了使用内联函数的位置上(相当于宏),也不存在函数调用,开销小(但是如果内联函数过于复杂,开销并不小,甚至比函数调用还大)。

 

内联函数 和 宏 的区别

1. inline在编译期间展开(将实参传递给形参,使用函数的代码替换函数的调用);而宏在预处理时进行文本替换

2. 宏定义不检查函数参数和返回值,只是展开;内联函数是真正的函数,会检查参数类型,更安全

 

(〃>_<;〃)(〃>_<;〃)(〃>_<;〃)

标签:头文件,函数,int,++,n1,内联
From: https://www.cnblogs.com/wjjgame/p/17822052.html

相关文章

  • probe函数
    驱动注册的probe函数probe(探测)函数在设备驱动注册最后收尾工作,当设备的device和其对应的driver在总线上完成配对之后,系统就调用 platform设备的probe函数完成驱动注册最后工作。资源、 中断调用函数以及其他相关工作。下面是probe被调用的一些程序流程。从driver_register看......
  • 无涯教程-批处理 - Classic for 循环 Implementation函数
    以下是大多数编程语言中可用的经典"for"语句。for(variabledeclaration;expression;Increment){statement#1statement#2…}批处理脚本语言没有类似于上述语法的直接"for"语句,但仍然可以使用if语句和标签来实现经典的"for"循环语句。让无涯教程看看批处理......
  • 无涯教程-批处理 - For 语句 - List Implementations函数
    "for"构造为批处理文件提供循环功能,以下是用于处理值列表的"for"语句的常见结构。FOR%%variableINlistDOdo_something经典的"for"语句由以下部分组成-variable变量    -对于整个循环,此步骤仅执行一次,并用于声明将在循环中使用的任何变量,在批处理脚本中变量声......
  • C语言程序设计 函数递归调用示例
    函数递归调用示例(教材习题5.3,运行结果012345)#include<stdio.h>voidfun(intk);voidmain(){intw=5;fun(w);}voidfun(intk){if(k>0)fun(k-1);printf("%d",k);}......
  • 打工笔记------------------------记录C#调用Windows API函数
    一,windowsAPI助手类usingNLog;usingSystem;usingSystem.Collections.Generic;usingSystem.Drawing;usingSystem.Linq;usingSystem.Runtime.InteropServices;usingSystem.Text;usingSystem.Threading;namespaceGateway{publicclassWindowAPI{......
  • 无涯教程-批处理 - While 语句 Implementation函数
    批处理脚本中没有直接的while语句,但是无涯教程可以使用if语句和标签很容易地实现此循环。下图显示了此循环的图解说明。while实现的第一部分是设置计数器,这些计数器将用于控制对"if"条件的判断,然后,无涯教程定义标签,该标签将用于体现while循环实现的整个代码,"if"条件将计算表......
  • 【misc】[HNCTF 2022 Week1]lake lake lake(JAIL) --沙盒逃逸,globals函数泄露全局变量
    查看附件内容这道题的逻辑就是可以让你输入1或者2,进入各自的函数去执行功能func函数:deffunc():  code=input(">")  if(len(code)>9):    returnprint("you'rehacker!")  try:    print(eval(code))  except:    pass......
  • 无涯教程-批处理 - Nested If 语句函数
    有时,要求彼此之间嵌入多个"if"语句。以下是此声明的一般形式。if(condition1)if(condition2)do_something因此,仅当满足condition1和condition2时,才会执行do_something块中的代码。以下是如何使用嵌套if语句的示例。@echooffSET/Aa=5SET/Ab=10if%a%==5if%b......
  • Linux文件编程(lseek函数和stat函数)
    (文章目录)前言本篇文章来讲解lseek函数和stat函数,lseek函数主要用来设置文件偏移量,stat函数主要用来获取文件属性。一、lseek函数lseek函数用于在打开的文件中移动文件指针的位置。它可以用于设置文件的读写位置或查找特定位置的数据。函数原型如下:#include<unistd.h>o......
  • 函数-数据合并
    concat和mergeconcat主要用于将数据沿着指定轴连接,不涉及键的匹配。merge主要用于基于键的匹配来合并数据,用于连接不同数据集的相关数据。 ......