✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/fYaBd
📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
13. 指针和引用的区别
从普通角度回答:
指针可以有多级指针,而引用不能有多级引用。
引用更安全些,因为能够确保引用指的是分配的一块内存,而指针可能会出现野指针的情况。
从反汇编分析:
指针:
-
指针是一个变量,存储对象的内存地址。
-
指针的值可以被修改,可以指向不同的对象或者被置为空(nullptr)。
-
通过指针访问对象时,编译器会生成相应的指针操作指令,如加载指针的值、存储指针的值、指针偏移等。
-
需要使用解引用(*)操作符来获取指针指向的对象,该操作会引起额外的内存访问。
引用:
-
引用是一个别名,引用一个已经存在的对象。
-
引用在声明时必须初始化,并且不能被重新赋值为引用其他对象。
-
使用引用访问对象时,编译器会将引用直接转换为对对象的访问,而不会生成额外的指令。
-
引用的访问方式类似于直接访问对象,无需使用解引用操作符。
从反汇编的角度来看,指针使用起来比引用更灵活,但也更容易出错。指针需要额外的指令来读取和修改指针的值,而引用可以直接通过对象访问来实现。因此,在性能要求高、需要灵活操作对象的情况下,指针可能更适合;而在简单的对象访问和避免错误的情况下,引用则更为方便和安全。
int a = 10;
int* p = &a; //lea eax,[a] mov dword ptr[ebp-8],eax
int& b = a; //lea eax,[a] mov dword ptr[ebp-0Ch],eax
*p = 20; //mov eax,dword ptr[ebp-8] mov dword ptr[eax],14H
b = 20; //mov eax,dword ptr[ebp-0Ch] mov dword ptr[eax],14H
14. 句柄和指针的区别和联系是什么?
句柄和指针其实是两个截然不同的概念。
Windows 系统用句柄标记系统资源,隐藏系统的信息。你只要知道有这个东西,然后去调用就行了,它是个 32 bit 的 uint。
指针则标记某个物理内存地址,两者是不同的概念。
15. 静态链接和动态链接有什么区别?
静态链接是在编译链接时直接将需要的执行代码拷贝到调用处;
-
优点在于程序在发布时不需要依赖库,可以独立执行;
-
缺点在于程序的体积会相对较大,而且如果静态库更新之后,所有可执行文件需要重新链接。
动态链接是在编译时不直接拷贝执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运行到指定代码时,在共享执行内存中寻找已经加载的动态库可执行代码,实现运行时链接;
-
优点在于多个程序可以共享同一个动态库,节省资源;
-
缺点在于由于运行时加载,可能影响程序的前期执行性能。