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

C++:inline关键字nullptr

inline关键字

  • C中inline使用关键点强调
    (1)inline是一种“用于实现的关键字”,而不是一种“用于声明的关键字”,所以关键字 inline 必须与函数定义体放在一起,而不是和声明放在一起
    (2)如果希望在多个c文件中使用,则inline函数应该定义在h文件中(不需要额外声明);
    如果只在一个c文件中使用,则inline函数可以定义在c文件或h文件中(若定义在c文件时可以声明到h文件中去,声明时可以不加inline)
    (3)inline函数在项目中可以多次定义,只要函数体完全相同且在一个c文件范围只定义一次
    (4)inline只是一种对编译器的建议而不是强制,所以inline函数不一定真被inline
    (5)递归函数不应该被声明为inline,超过一定长度(通常是10行)的函数不应该被inline,内含循环的函数不建议被inline

inline 是 C++ 中的一个关键字,用于指定函数应该在调用的地方直接展开(inlining),而不是作为一个普通函数调用。这种技术通常用于提高代码的效率,因为当函数体被内联后,函数调用的开销(如函数寻址和参数传递)会被消除,优化器可以直接使用函数体内的代码。

当一个函数被声明为 inline,编译器有权决定是否在实际编译期间将函数体插入到调用它的每个位置,这取决于函数的大小、复杂度以及编译器的内联策略。
如果一个函数被定义为 inline,并且编译器未进行内联,编译器会报告错误。
inline 关键字主要用于性能优化,但不是强制性的。对于内联函数,推荐只在小型、无副作用且频繁调用的函数上使用,否则过大的内联可能会增加编译后的代码体积。

  • C ++中inline新增的特性
    (1)定义在类声明之中的成员函数将自动地成为内联函数,例如如下代码:
class A
{ public:void Foo(int x, int y) { ... }   // **自动地成为内联函数,即使没有inline关键字** 
}

(2)如果在类中未给出成员函数定义,而又想内联该函数的话,那在类外要加上 inline,否则就认为不是内联的。值得注意的是:如果在类体外定义inline函数,则心须将类定义和成员函数的定义都放在同一个头文件中,否则编译时无法进行置换。

nullptr

  • C语言中的NULL
    (1)NULL用来标记野指针
    (2)NULL在C和C++中的定义为什么不同?因为C++不允许void *隐式转为int *等类型
    (3)C++中也可以继续用NULL,但是因为函数重载的引入,NULL传参会带来歧义
    C语言中NULL就是(void *)0
    C++语言中NULL就是0
int *p = 0;
if(0!=p){//解引用指针p
}
  • nullptr如何工作
    (1)nullptr传参,表示真正的空指针
    (2)nullptr的本质
const class nullptr_t{
public:template<class T> inline operator T*()const {return 0;}template<class C, class T> inline operator T C::*() const {return 0;}
private:void operator&() const;
} nullptr={};
  • 思考:NULL和nullptr到底有什么区别
    1、NULL是个宏定义,而nullptr是个关键字
    2、NULL本质是一个数字0,而nullptr本质是一个指针类型
    3、nullptr就是一个可以绕过C++严格的类型检查的NULL,就是因为C++不允许intp = (void)0这样,所以才有了nullptr
    I

  • nullptr的评价
    (1)C++11开始可用,注意版本要求
    (2)实践中在判断野指针时很多人还是喜欢if (!p)这样···
    (3)nullptr无法解决char *p和int *p这样的传参重载问题,所以还是有点不完美
    (4)nullptr不属于任何一种对象指针,但是却可以表示任何类型的空指针

总结

了解inline关键字的使用
理解什么是nullptr

学习记录,侵权联系删除。
来源:朱老师物联网大课堂

http://www.lryc.cn/news/386392.html

相关文章:

  • 数字信号处理实验三(IIR数字滤波器设计)
  • Why is Kafka fast?(Kafka性能基石)
  • Linux下的SSH详解及Ubuntu教程
  • MobPush HarmonyOS NEXT 版本集成指南
  • 什么是封装?为什么要封装?
  • 远程桌面无法复制粘贴文件到本地怎么办?
  • LeetCode 207. 课程表
  • 数据结构历年考研真题对应知识点(树的基本概念)
  • Pytorch和Tensorflow安装【Win和Linux】
  • 筑算网基石 创数智未来|锐捷网络闪耀2024 MWC上海
  • T4打卡 学习笔记
  • 抖音矩阵云混剪系统源码 短视频矩阵营销系统V2(全开源版)
  • zabbix报警机制
  • 【Matlab】-- 飞蛾扑火优化算法
  • 全面体验ONLYOFFICE 8.1版本桌面编辑器
  • 建议csdn赶紧将未经作者同意擅自锁住收费的文章全部解锁,别逼我用极端手段让你们就范
  • Pycharm一些问题解决办法
  • ONLYOFFICE 桌面编辑器 8.1 发布:全新 PDF 编辑器、幻灯片版式、增强 RTL 支持及更多本地化选项
  • Linux高并发服务器开发(六)线程
  • Google发布Gemma 2轻量级开放模型 以极小的成本提供强大的性能
  • 精品UI知识付费系统源码网站EyouCMS模版源码
  • 使用Apache POI库在Java中导出Excel文件的详细步骤
  • 基于C#在WPF中使用斑马打印机进行打印
  • 六、资产安全—信息分级资产管理与隐私保护练习题(CISSP)
  • 使用 AutoGen 的 AI 智能体设计模式
  • Android InputChannel连接
  • 爬虫笔记17——selenium框架的使用
  • [BUUCTF从零单排] Web方向 02.Web入门篇之『常见的搜集』解题思路(dirsearch工具详解)
  • 深度相机识别物体——实现数据集准备与数据集分割
  • STM32第十一课:ADC采集光照