首页 > 编程语言 >(C++)内联函数——<入门>

(C++)内联函数——<入门>

时间:2024-04-03 21:29:06浏览次数:23  
标签:函数 C++ 编译 编译器 inline 内联 入门

概念:

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。

如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。

 查看方式:

1. 在release模式下,查看编译器生成的汇编代码中是否存在call Add

2. 在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不会对代码进行优化,以下给出vs2013的设置方式)

 

特性:

1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运 行效率。

2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建 议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不 是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。下图为 《C++prime》第五版关于inline的建议:

 3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址 了,链接就会找不到。

// F.h
#include <iostream>
using namespace std;
inline void f(int i);

// F.cpp
#include "F.h"
void f(int i)
{
   cout << i << endl;
}

// main.cpp
#include "F.h"
int main()
{
   f(10);
   return 0;
}
// 链接错误:main.obj : error LNK2019: 无法解析的外部符号 "void __cdecl 
f(int)" (?f@@YAXH@Z),该符号在函数 _main 中被引用

【面试题】

宏的优缺点

 优点:

1.增强代码的复用性。

2.提高性能。

缺点:

1.不方便调试宏。(因为预编译阶段进行了替换)

2.导致代码可读性差,可维护性差,容易误用。

3.没有类型安全的检查 。

C++有哪些技术替代宏?

1. 常量定义:换用const、enum

2. 短小函数定义: 换用内联函数

标签:函数,C++,编译,编译器,inline,内联,入门
From: https://blog.csdn.net/2301_79580018/article/details/137357270

相关文章

  • C++ While 和 For 循环:流程控制全解析
    C++Switch语句使用switch语句选择要执行的多个代码块之一。语法switch(expression){casex://代码块break;casey://代码块break;default://代码块}它的工作原理如下:switch表达式被评估一次表达式的值与每个case的值进行比......
  • 拼多多虚拟项目:入门到精通,开一个月入万把块的店铺 真不难(24年更新)
    拼多多虚拟项目:三两句话解决选品难,一个方法判断产品容不容易被投诉,产品会不会被起诉(简单、粗暴、好用)做虚拟电商项目,卖什么最安全?有人可能会说卖素材。因为素材都是没有版权的,不会被投诉更不会被起诉。但,我可以很负责任的告诉你,素材照样有版权。即使是一张图片,一个PSD源文......
  • [6] UE C++ FlappyBird
    FlappyBird项目引入Paper2D插件//渲染资产的组件classUPaperSpriteComponent*RenderLandComponent;//资产classUPaperSprite*LandSprite;GameModeBase.h.cppUE枚举声明//枚举(用于描述状态信息)UENUM()enumEBirdStateTest//传统枚举{ EBS_Wait,//等待游戏开始......
  • 【零基础入门芯片课】半导体是什么?
    大家好,我是砖一。今天给大家分享一下半导体的基础知识,普及一下何为半导体,有从事IC,功率元器件,开关电源的朋友可以了解一下,希望对你有用~近几年,我们或多或少听过半导体,芯片等等一些高端名词,但是却对这些名词很难用大白话说清楚道明白,下面用简单的语言形容一下什么是半导体。1......
  • C++中的虚函数和虚函数表
    在上面一篇博客中 https://www.cnblogs.com/wphl-27/p/18111083,提到了虚函数,纯虚函数这篇博客我想继续进一步来说一下虚函数和虚函数表在C++中,每一个含有虚函数的类,编译器都会为它啊做出一个虚函数表(通常叫做vtable),这个虚函数表里面的每个元素都是函数指针,每个元素(函数......
  • C++构建工具_bazel
    apollo工具1.DreamView可视化交互工具DreamView是一个web应用程序,提供如下的功能: 可视化显示当前自动驾驶车辆模块的输出信息。例如:规划路径、车辆定位、车架信息等。为使用者提供人机交互接口以监测车辆硬件状态,对模块进行开关操作,启动自动驾驶车辆等。提供......
  • 用c++实现百元买百鸡问题、顺序查找
    5.1.2百元买百鸡问题【问题】已加公鸡5元一只,母鸡3元一只,小鸡1元三只,用100元钱买100只鸡, 问公鸡、母鸡、小鸡各多少只?【想法】 设公鸡、母鸡和小鸡的个数分别为x、y、z,则有如下方程组成立,则百元买百鸡问题转换为求方程组的解。应用蛮力法求力程组的解只能依次试探变量x......
  • C++之STL的algorithm(5)之生成算法(accumulate、fill)整理
    C++之STL的algorithm(5)之生成算法(accumulate、fill)整理注:整理一些突然学到的C++知识,随时mark一下例如:忘记的关键字用法,新关键字,新数据结构C++的遍历算法整理C++之STL的algorithm(5)之生成算法(accumulate、fill)整理一、生成算法1、accumulate累加算法2、fill填充算法......
  • C++实现windows高精度微秒级延时(亲测可用)
    C++实现windows高精度微秒级延时(亲测可用)代码如下:#include<iostream>#include<windows.h>//定义一个结构体来保存性能计数器的频率和时间戳structPerformanceCounter{LARGE_INTEGERfrequency;//计数器频率LARGE_INTEGERstart;//开始时间......
  • 给c++小白的教程2:输出(1)
    想要输入代码,就必须打开新的源代码#include<bits/stdc++.h>usingnamespacestd;intmain(){ return0;}请萌新牢牢记住这段代码!!!要形成肌肉记忆!!!#include<bits/stdc++.h>是头文件,bits/stdc++.h是万能头,包括了c++里的绝大多数函数与数据结构usingnamespacestd;是命......