C++面经 03-07记录

菜鸡因为在国企躺的确实不爽,有时候自己学到了一些东西,但是却不能应用起来,也没有自驱力去做一个开源项目,对自己半年来的技术进步也很不满意,决定离开。这是第一次c++开发的面试经验,其实答得很不好,但是面试官还是放了一马,让我通过了,要好好努力一下。
因为项目中提到了线程安全,所以第一个问题就是
什么是线程安全
其实这个问题本菜鸡答得非常不好,我也不知道啥是线程安全的定义,就开始讲可重入函数,多线程读数据,举了一个两个线程互相做加法的导致的错误
可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题

标准解答 在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。

进程与线程的区别
进程:
是程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。
线程:
是进程的一个执行单元,是进程内科调度实体。
其实没有答出区别
地址空间:
线程共享本进程的地址空间,而进程之间是独立的地址空间。
资源:
线程共享本进程的资源如内存、I/O、cpu等,不利于资源的管理和保护,而进程之间的资源是独立的,能很好的进行资源管理和保护。
健壮性:
多进程要比多线程健壮,一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。
执行过程:
每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口,执行开销大。
但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,执行开销小。
可并发性:
两者均可并发执行。
切换时:
进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。
进程的内存空间
这题我也不会,只说了堆栈代码段静态区(.data/.bss)常数段,被说不是,进程中中内存布局如下,主要是少了内核虚拟存储器和共享库的映射
在这里插入图片描述
线程间的同步手段
互斥锁,条件变量,读写锁,信号量
我错误的加上了std::future,被狂问,麻了。
future对象提供访问异步操作结果的机制,从异步任务中返回结果。调用get()。

这里附加一下同步与异步
定义:同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)。同步,就是调用某个东西是,调用方得等待这个调用返回结果才能继续往后执行。异步,和同步相反 调用方不会理解得到结果,而是在调用发出后调用者可用继续执行后续操作,被调用者通过状体来通知调用者,或者通过回掉函数来处理这个调用。ROS里面都是异步的。

好几道题答得都很差,面试官在这里已经在疯狂想题目了,真为难他了

什么是内联函数,哪些函数应该被设计为内联的
谈了一下内联展开,函数调用创建临时栈,销毁,时间,以及循环,递归,switch过长代码不适合内联。
当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置。
好处就是加快程序的速度,坏处就是加大了程序的体积

不能被设置为内联的情况
一个函数可以自已调用自已,称为递归调用(后面讲到),含有递归调用的函数不能设置为inline;
使用了复杂流程控制语句:循环语句和switch语句,无法设置为inline;
由于inline增加体积的特性,所以建议inline函数内的代码应很短小。最好不超过5行。
inline仅做为一种“请求”,特定的情况下,编译器将不理会inline关键字,而强制让函数成为普通函数。出现这种情况,编译器会给出警告消息。
在你调用一个内联函数之前,这个函数一定要在之前有声明或已定义为inline,如果在前面声明为普通函数,而在调用代码后面才定义为一个inline函数,程序可以通过编译,但该函数没有实现inline。

内联与宏的区别
主要考察C++编译的过程,预处理、编译、汇编、链接
内联函数是在编译时展开,而宏在预编译时展开;在编译的时候,内联函数直接被嵌入到目标代码中去,而宏只是一个简单的文本替换。
内联函数可以进行诸如类型安全检查、语句是否正确等编译功能,宏不具有这样的功能;宏不是函数,而inline是函数。
宏在定义时要小心处理宏参数,一般用括号括起来,否则容易出现二义性。而内联函数不会出现二义性。

宏的优势,可以使用宏得到静多态,各种方便调用的接口等
然后问了问宏的一些使用,没啥意思

哪些操作符不能被重载
只答出sizeof ,::,.
(1)"."(类成员访问运算符)
(2)" .*"(类成员指针访问运算符)
(3) “::”(域运算符)
(4)“siezof”(长度运算符)
(5) " ?:"(条件运算符)

构造函数和析构函数可以抛出异常吗
可以,但不推荐,建议init()+ close()

什么是虚函数
淦,我是真的怕什么是这种题目,就提了提在父类里被virtual修饰函数,子类重写的就是虚函数
不过也确实差不多

构造与析构函数可以是虚函数吗
构造不可以,析构可以,顺带谈谈虚表

构造和析构函数里面可以调用虚函数吗
balabala一大堆,错的。
不对劲,我看了一下,是面试官错了,我说对了
可以,虚函数底层实现原理(但是最好不要在构造和析构函数中调用) 可以,但是没有动态绑定的效果,父类构造函数中调用的仍然是父类版本的函数,子类中调用的仍然是子类版本的函数。 effictive c++第九条,绝不在构造和析构过程中调用virtual,因为构造函数中的base的虚函数不会下降到derived上。而是直接调用base类的虚函数。绝不在构造和析构函数中调用virtual函数:

建议init()+ close()

重载和重写的区别

智能指针使用过吗
有的,然后现场口述设计了一个shared_ptr,交流了一下线程安全的shared_ptr的设计思路
顺带巴拉巴拉六种特殊的函数

智能指针可以放在vector中吗
。。。答了可以,让我回去看看

什么时候会用到模板类
答:封装数据结构的时候最常用
多个类有着共同操作,但是数据类型不同

设计模式了解哪些
单例模式,工厂,抽象工厂,建造者,策略,状态

刷题
只出现一次的数字
两个只出现一次的数字
链表环和入口节点
完全二叉树判断
10^10个手机号的查找,聊了一下数据库的索引B+tree和字典树,分段导入内存

怎么说呢,面试的感觉还可以,一写完感觉有点网红题,也不算难,其实没啥意思。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值