初识C++ (四)

简介: 初识C++ (四)

多次函数调用的缺陷


我们先来看代码


int Add(int x, int y)
{
  return x + y;
}
int main()
{
  int ret = 0;
  ret = Add(2, 3);
  ret = Add(2, 3);
  ret = Add(2, 3);
  ret = Add(2, 3);
  ret = Add(2, 3);
  ret = Add(2, 3);
  ret = Add(2, 3);
  ret = Add(2, 3);
  return 0;
}


根据我们在函数栈帧这节课中学到的知识


这样子调用函数有什么缺陷?

011499cf589d429e86a7bd33b36dc2dc.png


这是是不是会频繁的调用函数栈帧啊


C语言解决方案


这里c语言中是不是给出了一种解决方案 叫做 宏


我们来尝试用宏改写下这个函数


#define ADD(x,y) ((x)+(y))


这样子


注意 这里有很多不注意宏的写法的同学会出现各种各样的错误


比如说宏内部写成 int x int y


又或者说 忘记在x y以及x y的运算上加括号


写成宏定义之后就能减少函数栈帧的调用 从而提高一定的效率了


C++给出的解决方案: 内联函数


概念


以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调


用建立栈帧的开销,内联函数提升程序运行的效率。


还是以我们上面的ADD函数为例


我们在c++程序中可以这么写


运行

inline int Add(int x, int y)
{
  return x + y;
}

fc278915edf34a799064834d51533270.png


我们首先先来看看最后结果怎么样


转到汇编代码

14c64c44bbd74d17a4e37eb1f1cc3c39.png


我们发现在执行ADD宏的时候并没有call建立新的函数栈帧


那我们再来看看内联函数的

11e19d65410244f6a6c3c6d7fbd105cc.png


我们发现 咦 这里怎么call了一个Add函数啊


68d51b17a8304a4a93e771f2ca7fad9a.png


这是因为这里 我们需要开一下内链的优化


不然会系统默认不会使用内链函数


内链函数的注意点


1 内链只是建议


你敲出这么一行代码


inline int Add(int x, int y)


并不是说编译器就会使用内联函数了


它会有一个自己的判断


也就是说 你的这一行命令只是起到建议作用


2. 优缺点


inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会


用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运


行效率。


缺点很好理解 函数展开了目标文件自然就变大了


优点也是 没有栈帧的调用了 那么效率自然也就提升了


3. 不能声明定义分离


inline不建议声明和定义分离,分离会导致链接错误。


那么这是为什么呢?


因为在使用inline之后 函数就会被展开


那么这样子是不是就没有函数地址了啊


所以说就找不到了


C++中替代宏的手段


常量定义 换用const enum

短小函数定义 换用内联函数


简单介绍下


比如说我们想定义一个常量N = 10


在c语言中可以这么定义


#define N 10


但是在我们的C++中就可以这么定义


const int N = 10;


这样子就成功替换了宏的使用


而对于函数来说 使用内联函数来替换宏上面已经介绍过了


总结


本文简单介绍了内联函数 对比了内联函数还有宏


由于博主的水平有限所以难免博客中会出现纰漏 希望大佬们看到之后可以即使指正

最后如果这篇博客帮助到了你 别忘了一键三连啊


阿尼亚 哇酷哇酷!


相关文章
|
9天前
|
弹性计算 人工智能 安全
对话 | ECS如何构筑企业上云的第一道安全防线
随着中小企业加速上云,数据泄露、网络攻击等安全威胁日益严重。阿里云推出深度访谈栏目,汇聚产品技术专家,探讨云上安全问题及应对策略。首期节目聚焦ECS安全性,提出三道防线:数据安全、网络安全和身份认证与权限管理,确保用户在云端的数据主权和业务稳定。此外,阿里云还推出了“ECS 99套餐”,以高性价比提供全面的安全保障,帮助中小企业安全上云。
201862 13
对话 | ECS如何构筑企业上云的第一道安全防线
|
17天前
|
调度 云计算 芯片
云超算技术跃进,阿里云牵头制定我国首个云超算国家标准
近日,由阿里云联合中国电子技术标准化研究院主导制定的首个云超算国家标准已完成报批,不久后将正式批准发布。标准规定了云超算服务涉及的云计算基础资源、资源管理、运行和调度等方面的技术要求,为云超算服务产品的设计、实现、应用和选型提供指导,为云超算在HPC应用和用户的大范围采用奠定了基础。
179633 22
|
5天前
|
弹性计算 人工智能 安全
|
4天前
|
安全 数据安全/隐私保护
阿里云 SASE 2.0 能力迭代|构建一体化办公数据安全解决方案
阿里云SASE能力全新升级,快速构建数据安全治理与运营体系。
1083 5
|
26天前
|
人工智能 自然语言处理 前端开发
从0开始打造一款APP:前端+搭建本机服务,定制暖冬卫衣先到先得
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。
9818 29
|
4天前
|
搜索推荐 物联网 PyTorch
Qwen2.5-7B-Instruct Lora 微调
本教程介绍如何基于Transformers和PEFT框架对Qwen2.5-7B-Instruct模型进行LoRA微调。
371 32
Qwen2.5-7B-Instruct Lora 微调
|
7天前
|
机器学习/深度学习 人工智能 安全
阿里云先知安全沙龙(武汉站) ——AI赋能软件漏洞检测,机遇, 挑战与展望
本文介绍了漏洞检测的发展历程、现状及未来展望。2023年全球披露的漏洞数量达26447个,同比增长5.2%,其中超过7000个具有利用代码,115个已被广泛利用,涉及多个知名软件和系统。文章探讨了从人工审计到AI技术的应用,强调了数据集质量对模型性能的重要性,并展示了不同检测模型的工作原理与实现方法。此外,还讨论了对抗攻击对模型的影响及提高模型可解释性的多种方法,展望了未来通过任务大模型实现自动化漏洞检测与修复的趋势。
|
12天前
|
机器学习/深度学习 分布式计算 供应链
阿里云先知安全沙龙(上海站) ——大模型基础设施安全攻防
大模型基础设施的安全攻防体系涵盖恶意输入防御和基础设施安全,包括框架、三方库、插件、平台、模型和系统安全。关键漏洞如CVE-2023-6019(Ray框架命令注入)、CVE-2024-5480(PyTorch分布式RPC)及llama.cpp中的多个漏洞,强调了代码安全性的重要性。模型文件安全方面,需防范pickle反序列化等风险,建议使用Safetensors格式。相关实践包括构建供应链漏洞库、智能化漏洞分析和深度检测,确保全方位防护。
|
11天前
|
机器学习/深度学习 人工智能 安全
通义视觉推理大模型QVQ-72B-preview重磅上线
Qwen团队推出了新成员QVQ-72B-preview,这是一个专注于提升视觉推理能力的实验性研究模型。提升了视觉表示的效率和准确性。它在多模态评测集如MMMU、MathVista和MathVision上表现出色,尤其在数学推理任务中取得了显著进步。尽管如此,该模型仍存在一些局限性,仍在学习和完善中。
|
11天前
|
Java Maven
Maven编译报错:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0:compile 解决方案
在执行Maven项目中的`install`命令时,遇到编译插件版本不匹配的错误。具体报错为:`maven-compiler-plugin:3.13.0`要求Maven版本至少为3.6.3。解决方案是将Maven版本升级到3.6.3或降低插件版本。本文详细介绍了如何下载、解压并配置Maven 3.6.3,包括环境变量设置和IDEA中的Maven配置,确保项目顺利编译。
Maven编译报错:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0:compile 解决方案