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

松江建设新城有限公司网站拉新推广变现app

松江建设新城有限公司网站,拉新推广变现app,织梦做小游戏网站,最大的软件公司文章目录 前言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/49401/

相关文章:

  • 枞阳做网站重庆建设工程造价信息网站
  • 宿州商务网站建设呼和浩特做网站公司
  • 电脑维修网站模板网页设计板式类型
  • 百度云虚拟主机如何建设网站网站系统升级维护需要多长时间
  • 做网站成功案例做网站运营好还是SEO好
  • 网站建设窗口框架wordpress年会员
  • 做网站公司关键词化外外贸婚纱礼服网站
  • 南昌网站建设模板技术公司晋城购物网站开发设计
  • 太原做网站价格关键词搜索优化外包
  • 做网站月薪资多少稿定设计手机版下载
  • 2018爱情动做网站网站建设中备案
  • 网站托管什么意思搜索引擎营销的特点有
  • 世界杯哪个网站做代理长沙营销策划公司排名
  • 微信运营网站建设网站宣传文案范例
  • 网站电脑速成培训班天津网页模板建站
  • 网站建设飠金手指排名十一做购物平台网站需要多少资金
  • ps做网站如何中国十大网络营销公司
  • 小型网站开发要多少钱wordpress滑块部分
  • 广西住房和城乡建设厅网站证件wordpress 默认自带插件
  • 马云做中国最大的网站莆田市秀屿区建设局网站
  • 运动网站源码网站的网页设计毕业设计
  • 中英文网站asp怎么做wordpress模板脚步代码哪里修改
  • 魔方建站商务网站建设的六个步骤
  • 怎么看wordpress用了哪个主题山西seo排名
  • 怎么做淘宝网站教程做天猫网站设计难吗
  • 网站被k怎么办移动互联网开发人才网
  • 东莞设计网站大兴黄村网站建设公司
  • 网站响应式首页模板哈尔滨个人建站模板
  • 网优 是什么网站黑帽seo培训大神
  • 中国顺德手机网站设计微信小程序加盟哪个好