常用基础知识面试(C++为主)

挺多家公司面试都问相关基础问题(C++为主),有的时候一紧张老答不全,赶紧列出来,每天背三遍,吾日三省吾身。

1.引用和指针的区别
①指针是一个实体,需要分配内存空间;引用只是变量的别名,不需要分配内存空间。
②引用在定义的时候必须进行初始化,并且不能够改变。指针在定义的时候不一定要初始化,并且指向的空间可变。
③指针和引用的自增运算结果不一样。(指针是指向下一个空间,引用时引用的变量值加1)。
④sizeof 引用得到的是所指向的变量(对象)的大小,而sizeof 指针得到的是指针本身的大小。
⑤引用访问一个变量是直接访问,而指针访问一个变量是间接访问。
⑥有多级指针,但是没有多级引用,只能有一级引用。

2.const int * ptr与 int * const ptr的区别
①const int * ptr是指该指针指向一个const int,即指针的指向可以改变,而指针指向的内容不可以发生改变。
②int * const ptr是指改指针的指向不能发生改变了,但是它指向的内容却可以发生改变。

3.C++的存储区(5个)
①栈:局部变量,函数参数等存储在该区,由编译器自动分配和释放。
②堆:需要程序员手动分配和释放(new,delete),属于动态分配方式。
③全局/静态存储区:全局变量,静态变量分配到该区,到程序结束时自动释放,包括DATA段(全局初始化区)与BBS段(全局未初始化段)。
④文字常量区:存放常量,而且不允许修改。程序结束后由系统释放。
⑤程序代码区:存放程序的二进制代码。

4.C++ 中 new 与 malloc 的区别
① new/delete是C++关键字,需要编译器支持。malloc/free是库函数,需要头文件支持。
② 参数:使用new操作符申请内存分配时不是必须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。
③ 返回类型:new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。
④ 内存分配失败时:new内存分配失败时,会抛出bac_alloc异常。malloc分配内存失败时返回NULL。
⑤ 重载:new允许重载,malloc不允许
⑥ 内存区域:new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。

5.进程和线程的区别
①进程和线程的定义分别是?
进程:是执行中一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。进程是表示资源分配的的基本概念,又是调度运行的基本单位,是系统中的并发执行的单位。
线程:单个进程中执行中每个任务就是一个线程。线程是进程中执行运算的最小单位。
②一个线程只能属于一个进程,但是一个进程可以拥有多个线程。多线程处理就是允许一个进程中在同一时刻执行多个任务。
③线程是一种轻量级的进程,与进程相比,线程给操作系统带来侧创建、维护、和管理的负担要轻,意味着线程的代价或开销比较小。
④线程没有地址空间,线程包含在进程的地址空间中。线程上下文只包含一个堆栈、一个寄存器、一个优先权,线程文本包含在他的进程 的文本片段中,进程拥有的所有资源都属于线程。所有的线程共享进程的内存和资源。 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段, 寄存器的内容,栈段又叫运行时段,用来存放所有局部变量和临时变量。

6.进程间通讯的方法(5种):
① 管道
② 命名管道(FIFO)
③ 消息队列
④ 信号量
⑤ 共享内存

7.线程间通讯的方法:
① 使用全局变量进行通信
② 使用自定义消息
std::promise 可以用来在线程间提供数据传递。
std::future = std::promise.get_future()
线程中可以对promise赋值std::promise.set_value
赋值之后std::future.get()就会返回其他线程中设置的
std::packaged_task 可以包裹一个函数, 有点类似std::function,不同之处在于这个可以通过get_future返回std::future对象来获取异步执行的函数结果。

猜你喜欢

转载自blog.csdn.net/qq_32418469/article/details/81409924