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

指针和引用;内联函数和普通函数

1. 指针和引用

1.1 定义和性质区别

  1. 指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。
  2. 可以有const指针,常量指针可以改变指向,指针常量不能改变指向,也可以有const引用,引用的指向不能改变
  3. 指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)
  4. 指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化
  5. 指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后指向的内存单元不再改变;
  6. “sizeof引用”得到的是所指向的变量(对象)的大小,而”sizeof指针”得到的是指针本身的大小,即地址的大小;
  7. 指针和引用的自增(++)运算意义不一样;

1.2 指针和引用作为函数参数进行传递时的区别

用指针传递参数,可以实现对实参进行改变的目的,是因为传递过来的是实参的地址,因此使用*a实际上是取存储实参的内存单元里的数据,即是对实参进行改变,因此可以达到目的。

在将引用作为函数参数进行传递时,实质上传递的是实参本身,即传递进来的不是实参的一个拷贝,因此对形参的修改其实是对实参的修改,所以在用引用进行参数传递时,不仅节约时间,而且可以节约空间。、

1.3 何时使用引用和指针

指向空值,可改变指向,多级传递:指针;可用引用的地方都可用用指针,反之不行。

2. 内联函数和普通函数的区别

普通函数调用时会使程序跳到另一个地址(函数的地址),并且在函数结束时返回。

  1. 执行函数调用指令,立即存储该指令的地址,并将函数参数保存到的堆栈。
  2. 跳到函数起点的内存单元,执行函数代码(将返回值保存到寄存器中。
  3. 跳回被保存指令的地址处。

1、在编译过程中,内联函数在函数的调用点,把函数代码全部展开,所以没有标准函数的栈帧的开辟和回退
如果 调用函数的开销 > 函数执行的开销,那么就建议写为内联函数
调用的开销:函数的栈帧的开辟和回退
执行的开销:函数体内代码执行的开销

2、内联函数只在本文件可见,编译阶段就进行了替换,所以不产生符号,所以一般在头文件中定义,这样就可以在其它文件调用。普通函数产生符号,多个文件引用头文件,会产生符号重定义的错误。
.编译阶段不编译.h文件,只编译.c 或.cpp 文件

注意:inline只在release版本起作用,debug版本inline函数也需要栈帧的开辟和回退

思考?

我们说到内联函数是编译器用函数相应的代码替代了函数调用

那内联函数还遵循按值传递参数吗?

a到底是0还是1?

inline void fun(int a){a=1;}int main(){int a=0;fun(a);cout<<a;return 0;
}

 在编译器看来:

inline void fun(int a){a=1;}int main(){int a=0;a=1; //fun(a);cout<<a;return 0;
}

输出结果:

输出表明,内联函数和普通函数一样,都是按值传递参数。 

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

相关文章:

  • 简单题67.二进制求和 (java)20240919
  • DDD的主要流程
  • linux驱动开发-设备树
  • 数据结构——二叉树堆的专题
  • 【C语言零基础入门篇 - 7】:拆解函数的奥秘:定义、声明、变量,传递须知,嵌套玩转,递归惊艳
  • ClickHouse在AI领域的结合应用
  • git push出错Push cannot contain secrets
  • OpenAI 的最强模型 o1 的“护城河”失守?谷歌 DeepMind 早已揭示相同原理
  • 【胡乱念叨】大模型的“我”
  • Flag_AGtivity_clear_top网页编程指南如何退出多activity程序
  • 克隆centos网卡uuid相同如何修改
  • C语言习题~day11
  • Ansible——Playbook基本功能???
  • 多线程学习篇一:启动多线程的三种方式
  • 【专题】2024跨境出海供应链洞察-更先进供应链报告合集PDF分享(附原数据表)
  • git submodule
  • 【Power Compiler手册】13.UPF多电压设计实现(3)
  • RTX 4090 系列即将停产,RTX 5090 系列蓄势待发
  • 【MySQL】使用C语言连接数据库
  • Vue学习记录之四(watch侦听器和watchEffect高级侦听器)
  • RedisTemplate操作ZSet的API
  • Android 15 正式发布至 AOSP
  • IEEE Electronic Library(IEL)数据库文献检索下载介绍及个人获取IEEE文献途径
  • 动手学习RAG:大模型重排模型 bge-reranker-v2-gemma微调
  • 蓝桥杯2024省C
  • C++:内部类,匿名对象,操作符new与delete
  • 【数据结构】排序算法---计数排序
  • mysql时间日期函数、获取当前日期和时间、日期和时间格式化、提取日期部分、日期和时间的算术操作、其他日期函数、日期和时间的比较、日期字符串转换
  • Android开发高频面试题之——kotlin篇
  • 8--SpringBoot原理分析、注解-详解(面试高频提问点)