230913上海零念科技CPP实习生面试记录

上来先做了个自我介绍,然后面试官介绍了他们是做系统进程调度的;

CPP

题目顺序并非实际问的顺序

1.类的大小

类的大小和什么东西有关系?

我答了成员变量和虚函数表

2.多态怎么实现的

顺着虚函数表问的,就说了一下动态多态的基本实现方式

3.只能在栈上的类

禁止拷贝构造和赋值,构造函数私有化,提供单独函数在栈上开辟空间;

顺便问了一下动态内存管理的基础形式

4.智能指针

哪些类型?有啥区别?weak ptr怎么解决循环引用问题的?

weak ptr的lock函数用过吗?有没有办法获取到shared ptr的引用计数?

unique_ptr可以转成share_ptr吗?

如果要用C++11的类型转换,要使用哪一个来进行unique_ptr和share_ptr的转换?(这个不会,应该是static_cast)

定制删除器是干嘛的?

智能指针线程安全吗?

拷贝构造share_ptr会不会有内存泄漏?

5.类型转换

C++11的类型转换,几个,区别是什么?

指针之间转换要用什么?(不会,答的static)

dynamic_cast父子转换的时候,向上还是向下是安全的?(子转成父是安全的,即向上安全)

6.单例

几种类型,怎么实现?

7.模板

模板的声明和定义为啥不能分离?(忘记了)

模板特化是什么?函数模板支持半特化吗?(不支持)

8.C++线程和async有啥区别?

thread是类,aysnc是函数

async有两种用法,一个是立马异步执行,会开一个线程;第二个是延迟同步执行,在使用future.get的时候才会执行。

这部分是在云账房面试的时候问道的,得亏我专门去学了,开心!

9.C++14新特性

知道的全说了,auto,lambda新特性,constexpr(和c++11的区别),变量模板,二进制变量,然后还说了最后几个std的函数看不明白;面试官人很好,一直说没关系;

专门问了constexpr声明变量和const有啥区别(不知道)

GPT的回答

  1. 时间点:constexpr 是在编译时确定值的,而 const 是在运行时确定值的。
  2. 编译期计算:constexpr 变量可以用于编译时期间的计算,比如数组大小、模板参数等需要在编译阶段确定大小的场景。而 const 变量只是表示它的值不可以修改,在编译阶段无法使用 const 变量进行编译期计算。
  3. 初始化:constexpr 变量必须在声明时进行初始化,并且只能使用常量表达式初始化;const 变量可以在声明时初始化,也可以稍后赋值,但赋值后就不能再修改。
  4. 地址:constexpr 变量往往会被编译器优化,可能不会占用内存空间,并且在编译期间被消除。const 变量在运行时分配内存,并且有相应的内存地址。
  5. 但是这两个关键字声明的变量都具有常量属性,不可修改;

对C++17有没有了解?(无)

10.stl用过什么?

把常用的stl都说了一遍

stl线程安全吗?当然不

11.vector和array区别

array是定长数组,vector动态开辟。注意array的空间也是在栈上的(不是堆的)

array可以使用迭代器,保证代码风格统一

这里顺便提到了[]的重载,面试官问了vector里面at函数和[]重载的区别(at会抛异常,[]不会)

12.emplace_back和push_back区别

我说了emplace_back能节省一次拷贝的消耗;

面试官问要怎么使用才能节省这个消耗?使用方式(不会)

emplace_back既然高效,为啥没有取代push_back?(不会,这里我就说了一下设计考虑兼容性的问题)

13.初始化列表、构造函数体内初始化、成员变量给缺省值

那个更好?有啥区别?

引用是没有办法使用缺省值的,只有常量/普通变量可以用缺省值;

在VS2019里面调试测试了一下运行顺序:

  • 缺省值(会优化成初始化列表)/初始化列表
  • 函数体内

具体的测试参考 CPP类和对象默认成员函数,里面详细注明了构造顺序;

14.默认构造函数

什么时候可以不自己写构造函数?

这里没有答全,感觉自己已经被绕晕了

15.function和bind的作用

如题

16.final/overide/explicit

作用

explicit忘记了,面试官说没关系,反正也不用🤣

Linux

1.进程通信

有哪些,这里主要问了共享内存和管道的优劣,使用谁的资源消耗更优(这里问的是资源消耗,不是通信速度)

我答的是因为管道是文件描述符,操作系统需要维护文件和进程之间的关系,所以消耗会高一点;然后共享内存是直接在页表上操作,没有额外的消耗;

咱也不知道对不对,感觉答案应该是下面这个

image-20230913212808024

问有没有用过消息队列(知道这玩意,没用过)

2.进程和线程区别

说了资源消耗区别,功能比较隔离的时候适合用进程,还举了个epoll的reactor模式的例子(我瞎编的,说实话,也不知道对不对)

3.开发环境

前期用vs2019,后期用vscode+remote ssh;

面试官问我很多个文件怎么进行编译和管理,我说了makefile;问有没有用过cmake(无)

4.编译链接过程

这个其实是第一个问的问题,就简单地说了一下;

5.动静态库

有啥区别?优缺点?

The end

没有问网络,也没有写OJ,也没有问项目;

这次的面试官很耐心,会引导你回答问题。爱了;