当前位置: 首页 > news >正文

免费网站在线观看人数在哪直播WordPress文章收录代码

免费网站在线观看人数在哪直播,WordPress文章收录代码,消防工程师证报考条件是什么,如何制造公司网址文章目录 前言1. "内联函数"被创造出来的意义2. 内联函数的概念2.1 内联函数在代码中的体现2.2 普通函数和内联函数的汇编代码 3. 内联函数的特性(重点)4. 总结 前言 本章来聊一聊C的创作者"本贾尼"大佬,为什么要创作出…

文章目录

  • 前言
  • 1. "内联函数"被创造出来的意义
  • 2. 内联函数的概念
    • 2.1 内联函数在代码中的体现
    • 2.2 普通函数和内联函数的汇编代码
  • 3. 内联函数的特性(重点)
  • 4. 总结

前言

本章来聊一聊C++的创作者"本贾尼"大佬,为什么要创作出内联函数,以及内联函数的定义和内联函数的实现机制等等。

话不多说,让我们直入主题!💖💖💖
哈哈哈

1. "内联函数"被创造出来的意义

请大家先看下面的代码:

#include<stdio.h>
int Add(int x, int y)
{return x+y;
}int main()
{int ret = Add(10, 20);//假设下面有很多地方都要用到Add函数return 0;
}

假设Add函数在主函数中有非常多的地方要使用到,我们的这种写法是最好的吗?

其实,我们这种写法并不好。从函数调用的效率来看,每当我们调用一次函数就要在栈区上开辟一块空间用作函数栈帧,等函数调用完之后,栈帧就会被销毁。但是在栈区上开辟空间以及栈帧的销毁都是会浪费时间资源的,更何况同一个函数调用很多次的情况。

那我们该怎么做呢?有一个办法就是将这个函数以一种绕开编译器在调用函数时会开辟函数栈帧的做法——“宏函数”。

#include<stdio.h>
//宏函数的写法
#define Add(x,y) ((x)+(y))int main()
{int ret = Add(10, 20);//假设下面有很多地方都要用到Add函数return 0;
}

宏函数的工作原理就是,在编译处于预处理阶段时,就会在使用宏函数的地方将对应的代码给替换进去。这样就相当于只是一个代码段了,而不是一个函数。

但是宏函数的写法实在是太容易出错了,而且使用宏函数还有以下的缺点:

  • 代码的可读性差
  • 不方便调试,复杂

了解了上述场景之后,我们就来了解一下C++的"祖师爷"是如何攻克这个难关的。

C++的"祖师爷"也发现了这个问题,于是他就创造出了一个函数"内联函数",这个函数能够完美的实现上述宏函数的功能和解决和宏函数的缺点。

2. 内联函数的概念

从形式上看:以关键字inline开头的函数,叫做内联函数。
从功能上看:C++编译器在调用内联函数的地方展开(函数体对应的内容),没有函数调用的消耗,提高效率。

内联函数的写法:

//在函数定义的开头加一个inline关键字
inline int Add(int x, int y)
{return x + y;
}

如果在上述的函数增加了inline关键字,在编译期间编译器会用函数体替换函数的调用。

那我们该怎么查看这个现象呢?可以通过查看汇编代码,来判断!!!
hahaha

2.1 内联函数在代码中的体现

(VS)查看方式:

  1. 在release模式下,查看编译器生成的汇编代码中是否存在call Add。(这种方法本人不推荐,因为在release模式下,代码不容易调试)
  2. 在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不会对代码进行优化)

按我们就得更改一下Debug下的配置信息:
第一步:点击项目文件夹,选择C/C++,之后点击常规,在调试信息格式中选择程序数据库模式。

第二步:继续在C/C++选项卡下,选择优化,在内联函数拓展这块选择只适用于__inline(/0b1)
步骤

2.2 普通函数和内联函数的汇编代码

(这里只是举个例子)
普通函数的汇编代码:
普通函数的汇编代码
内联函数的汇编代码:
内联函数的汇编代码

对比一下内联函数和普通函数的汇编代码的区别。可以看到的是对于普通函数的调用编译器是根据call指令来执行的。而对于内联函数来说,C++编译器则是直接将函数体里面的内容转换成汇编代码替换到了函数调用的地方

3. 内联函数的特性(重点)

1.🍉 inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势 :少了调用开销,提高程序运行效率。
2. 🍉inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略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 中被引用

4. 总结

本文讲解了内联函数,内联函数是否能够成功实现具体取决于编译器的做法,我们只是给编译器提一个意见。还有一个重要的点是我们定义和声明内联函数时,得两边都用inline,否则,因为inline的作用会使得函数的地址变成代替函数体的代码段的地址,在链接阶段会因为找不到这个函数而报错!


好了,本文就讲到这里了。如果觉得本文好不错的话,麻烦给偶点个赞吧!!!
hahahaha

http://www.yayakq.cn/news/912749/

相关文章:

  • 网站的模版要怎么重新做网络营销推广方案pdf
  • 沈阳建设厅官方网站北京互联网网站建设价格
  • 网站建设心得体会800字广西网站建设招标公司
  • 无锡市城市建设规划局网站自己做的腾讯充值网站
  • qq群推广引流免费网站企业seo报价表
  • 嘉兴专业网站建设创业如何进行网站建设
  • 美肤宝网站建设wordpress主题添加小工具
  • 百度云wordpress济宁网站建设优化亿峰
  • 湖北省城乡和住房建设厅官方网站建设部网站证件查询
  • 大型网站 网站建设在网页做动态图片的网站
  • 外贸服装网站模板永顺县建设局网站
  • 百度免费建立网站吗厦门信息网官网
  • 安徽省铜陵市建设银行网站购物网站服务中心
  • 网站抓取诊断ip出错怎样创建网站数据库
  • 网站建设为啥每年都要收费用户体验设计师证书
  • 武昌网站建设制作广西微信网站建设
  • 烟台H5高端网站建设网页制作与网站设计
  • 连州住房建设局网站网站设计 图片
  • iis新建网站dz整站免费网站建设
  • 自己建网站要学什么软件开发发布平台
  • 三合一网站怎么做开发三味
  • 成都做seo网站公司网站建设分解结构
  • 广州做外贸网站网站开发工资
  • 北京二手房网站精品课程网站建设毕业设计论文
  • 深圳专业企业网站制作全国购物网站排名
  • 西安网站建设那家好通了网站建设
  • 学校网站系统北京市中小企业公共服务平台
  • 网站建设的费用计入网站开发w亿玛酷1流量订制
  • 网站分辨率做96是否会更好python设计网页界面
  • 淘宝店铺装网站导航怎么做视频网站直播如何做