C++ 面试题演练

阿里云一面:

1.static关键字的作用

修饰局部变量,修饰全局变量,修饰函数,修饰成员函数
2.函数指针

指向函数的指针
3.引用和指针

引用是别名,指针是指向一个地址
4.new和malloc的区别

new和运算符,malloc是函数
5.堆和栈的区别

栈存放局部变量和函数压栈的参数,堆存放动态申请的变量,需要手动释放。
6.栈溢出
7.二叉平衡树和红黑数

高度平衡的二叉搜索树
8.哈希表解决冲突的方法

开链法
9.进程和线程的区别
10.为什么切换进程的代价比切换线程大
11.TCP和UDP的区别

TCP可靠面向连接,基于字节流

UDP不可靠,不面向连接,基于数据报文
12.TCP如何保证可靠性

TCP 可靠传输

1、确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传。

2、数据校验

3、数据合理分片和排序:

13.TIME_WAIT状态

保证最后一次挥手能够顺利到达。

 

关于操作系统的栈的知识补充

以Linux 32位平台为例,进程有4GB大小的虚拟地址空间,其中1GB留给系统内核,3GB是进程自身拥有。一个进程大致的内存布局如下图所示。

简单说明一下

代码段:存放可执行程序的代码,可读不可写

数据段:存放程序中已经初始化的静态(全局)变量,可读写

bss段:存放程序中未初始化的静态(全局)变量,可读写

堆(heap):存放动态分配的内容,需要程序猿手动分配和释放

栈(stack):存放局部变量,如函数的参数、返回地址、局部变量等,有系统自动分配和释放
 

2.2 函数调用开始
在调用一个函数时,系统会为这个函数分配一个栈帧,栈帧空间为该函数所独有。

调用者调用一个函数的过程大致如下:

函数参数从右到左入栈
返回地址入栈
上一函数ebp入栈
...
在上一函数ebp入栈后,就开辟了被调函数的新栈帧,接下来便是被调函数临时变量入栈等操作,如果被调函数里有继续调用新函数的操作,将继续开始上述的一系列操作,不断循环嵌套下去。下图表示函数调用过程中栈的布局情况。

2.3 函数调用结束
函数调用结束时的变化,主要就是按相反的顺序将数据弹出栈:

弹出临时变量
弹出调用函数的ebp值,存到ebp寄存器中
弹出返回地址,存到eip寄存器中
返回地址即是用call指令调用函数时下一条指令的地址,存到eip中,程序就知道在调用完后继续执行下一条指令。

我们会有一个疑惑,调用函数时将函数参数从右到左入栈,调用结束时怎么没有将它们弹出?

在这里,系统并不是用POP指令将它们弹出,而是通常通过ADD ESP让它们从栈中“消失”。
 

3. 栈溢出原理

那么,什么是栈溢出呢?栈溢出是指向向栈中写入了超出限定长度的数据,溢出的数据会覆盖栈中其它数据,从而影响程序的运行。

 

阿里云二面:
1.项目
2.有没有数据库分表、索引等经验
3.怎么确定查询有没有落实到索引上呢

数据库问的比较深


4.看你熟悉redis,是在项目中有实际用到吗
5.讲讲redis中的sds、跳跃表是怎么实现的,redis中还有哈希表,那他为什么不用hash表而要实现一个跳跃表呢
6.redis怎么做范围查询

 

C/C++的redis有时涉及到底层源码,需要看书。

 


7.sizeof是实现原理,是需要函数支持呢,还是操作系统支持
7.sizeof的结果是在哪个阶段确定的
8.让你实现sizeof的话怎么实现呢

 

sizeof的原理问道的一般不多

 


9.对象的首地址好确定,怎么确定一个对象的尾地址呢
10.项目中怎么处理高并发的问题呢
11.随着访问量的提高,你觉得项目中最可能那一块会出问题?


12.用过git吗,git和svn相比有什么优点吗

git是分布式的代码管理工具

 


13.有多线程编程经验吗?如果多线程中要对一个变量进行修改,要怎么做呢

加锁


14.互斥锁的实现原理
15.操作系统是怎么实现信号量的

互斥锁和信号量的实现原理也会问到。


16.多进程通信有哪些方式

管道,消息队列,fifo,共享内存
17.实际中有用到过这些通信方式吗

pipe管道用到过。


18.有没有抓过包

浏览器抓HTTP的包,wrieshark,tcpdump抓包
19.你说的主要是http抓包的,有Tcp的吗


20.你觉得你有什么擅长的,我这边还没有问到的
21.讲一下平衡二叉树
22.二叉树的几种遍历方式中,知道哪种或哪几种遍历顺序确定可以唯一确定二叉树
23.除了堆啊栈啊,平时项目中会用到哪些数据结构
24.vector有大小限制吗

理论上没有,实际上有
25.从浏览器中输入一个网址,需要经过哪些步骤
26.假如全国的人在同一时刻访问一个网站,怎么顶住这个压力?

 

美团后台开发一面:

1.介绍项目
2.引用和指针的区别
3.什么时候用引用,什么时候用指针
4.C++11里面构造函数有几种


5.析构函数需要注意什么
6.析构函数能不能调用虚函数
7.内存泄漏和内存溢出的区别,有什么联系
内存泄漏最终会导致内存溢出)
8.什么情况下CPU会达到100%
9.介绍一下项目中工具集的实现

 

作者:8月求个offer
链接:https://www.nowcoder.com/discuss/228118
来源:牛客网
 

问项目
vector list set的区别
多态原理
深浅拷贝
静态多态和动态多态
构造和析构需要注意什么
C++内存管理
代码管理工具
Redis恢复数据方式
TCP连接和断开步骤
服务器如果有大量的半连接状态的客户端连接,如何处理
手写冒泡
手写字符串拷贝

如果要考虑内存重叠呢?

 

 

项目
熟悉的排序算法
画图并解释快速排序流程和堆排序流程
手写算法题:第一天发1块钱,二三天发2块钱,四五六天发3块钱,那么求第n天时总共发了多少钱

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值