字节跳动

一面:

智能指针

(直接说了不太了解)https://blog.csdn.net/k346k346/article/details/81478223

面向对象跟面向过程的区别

c面向过程是为了解决一个问题而开发一个功能,c++面向对象,认为一切皆对象,具有抽象 封装 和多态三大特性,其中抽象是将一组对象,它们具有相同属性和行为方法的提取总结出来,并且封装到一个类中,可以将需要对外提供的功能暴露出接口,也可以隐藏具体的实现方法和数据类型。多态包含静多态和动多态,静多态是编译时期的多态,由重载和模板实现,动多态是运行时期的多态 由继承和虚函数实现。重载就是在同一个作用域下,函数名相同,参数个数或者参数类型不同的函数互称为重载函数,由于c++对函数的符号是函数名+参数+命名规则组成的,所以即使看着是调用相同的函数,但在编译期间就可以确定具体是在调用那个函数。模板也是在编译时期的多态,与重载不同,重载为解决同一个功能,但是要处理不同的函数类型,就有大量的冗余代码,模板把数据类型当成模板的参数传进来,在编译时,通过模板的数据类型来确定函数模板或者类模板内部的数据类型,并且实例化一份确定类型的 函数或者类。动多态是由继承和虚函数实现,在运行过程中才可以知道这个对象具体调用的是父类的还是子类的成员函数,(如何知道呢?),比如说如果一个基类的某个成员函数是虚函数,那么这个类的对象的空间中就会多一个虚指针指向一块虚表,表中存放了虚函数的入口地址,当基类又派生出子类,子类中如果有和虚函数同名同参数列表同返回值的函数,那么就会覆盖掉虚函数表中父类的虚函数地址。所以只能在运行期间通过虚函数表来确定 到底调用的是父类还是子类的虚函数。

虚拟内存空间的结构  静态局部对象存放在哪里

每个进程都有4G的虚拟内存空间,包括3G的用户空间和1G的内核空间,用户空间包含.text代码段,.data全局数据段已经初始化过,.bss未初始化的全局变量和静态的全局、局部变量,也会对其初始化成0,heap堆区是由程序员自己进行动态开辟的区域,从低地址向高地址增长,stack栈区保存局部变量 参数返回值 等数据,从高地址向低地址增长。

静态局部对象存放在.data段。用static 修饰局部变量,这个变量的作用域还是本函数,但是生命周期变长了,从第一次被定义就在.data开辟一个空间,只初始化这一次,函数调用结束后也不会消失,函数再次被调用时,这个静态局部变量不会再次初始化,可以继续使用上一次的值,知道程序全部结束,这个变量才会被销毁。

函数调用过程中发生什么变化

在函数调用之前,首先把形参按照从右往左的顺序进行压栈,然后使用ebp寄存器保存下一条指令的地址,为了在函数调用结束后能知道返回到调用处,接着开辟栈空间,把栈上的数值清零(确定是清零吗?),进行函数内部的操作,函数返回时,如果有返回值,返回值<4个字节,通过eax带出,4< <8通过eax和ebx一起带出,如果是自定义类型 或者>8字节,通过在栈上开辟一个临时变量带出。然后ebp出栈,将栈空间清空,返回到调用处。(那局部变量还能再访问吗?我回答如果再有函数将那块内存覆盖了 就不能访问了。)

poll epoll select ,select 为什么最多是1024个套接字?

IO复用,我自己写过一个在Linux下的文件传输系统,但是没有用select技术,而是父进程通过不停的监听,如果有连接请求,就通过创建子进程去处理这个请求,后来对IO复用技术也做了了解,select通过一个线程处理多个阻塞的IO ,将监听套接字的描述符放到一个数组中,数组最多放1024个fd,然后轮询监听这些fd,如果有连接请求就处理它。poll的原理与select非常相似,差别如下:描述fd集合的方式不同,poll使用 pollfd 结构而不是select结构fd_set结构,所以poll是链式的,没有最大连接数的限制。(当时还问了select 为什么最多是1024个套接字?,: 根据fd_size的定义,它的大小为32个整数大小(32位机器为32*32,所有共有1024bits可以记录fd),每个fd一个bit,所以最大只能同时处理1024个fd)             epoll是被动触发方式,给fd注册了相应事件的时候,我们为每一个fd指定了一个回调函数,当数据准备好之后,就会把就绪的fd加入一个就绪的队列中,epoll_wait的工作方式实际上就是在这个就绪队列中查看有没有就绪的fd,如果有,就唤醒就绪队列上的等待者,然后调用回调函数。

三次握手 为什么不是四次或者两次?

第一次握手:客户端发送一个请求连接的数据包给服务器,服务器收到后,发送一个确认连接以及请求连接客户端的数据包给客户端,这是第二次握手,第三次握手是客户端收到并且给服务器回复一个确认包。

如果两次并不能保证服务器与客户端的连接,三次握手可以防止已经失效的连接请求报文突然又传输到服务器端导致的服务器资源浪费。例如,客户端先发送了一个SYN,但是由于网络阻塞,该SYN数据包在某个节点长期滞留。然后客户端又重传SYN数据包并正确建立TCP连接,然后传输完数据后关闭该连接。该连接释放后失效的SYN数据包才到达服务器端。在二次握手的前提下,服务器端会认为这是客户端发起的又一次请求,然后发送SYN ,并且在服务器端创建socket套接字,一直等待客户端发送数据。但是由于客户端并没有发起新的请求,所以会丢弃服务端的SYN 。此时服务器会一直等待客户端发送数据从而造成资源浪费。四次握手却没有必要,四次握手的过程是:客户端发送一个请求连接的数据包给服务器,服务器收到后,发送一个确认连接的数据包给客户端,服务器又发送请求连接客户端的数据包给客户端,客户端收到并且给服务器回复一个确认包。中间的两次并不冲突 可以在一个数据包中传输,就没必要分成两个包占用带宽了。

判断一颗树是不是二叉搜索树

写了一会 没写出来,https://www.cnblogs.com/evenleee/p/8474496.html

找到数组内大于N的最短子序列

由于二叉树的题超时了,这题正在写 面试时间到,视频直接挂断了,进入二面。

 

 

二面:

c++ 与Python的区别

说了一些语法上的区别,包括数据结构和其他一些,面试官提示我说根本上的区别,PYTHON是一种脚本语言,是解释执行的,不需要经过编译,所以很方便快捷,且能够很好地跨平台,写一些小工具小程序特别合适。 
而C++则是一种需要编译后运行语言,在特定的机器上编译后在特定的机上运行,运行效率高,安全稳定。

进程与线程的区别

进程时正在运行的程序,是操作系统进行资源调度和分配的最小单位,而线程是进程的一个子任务,进程可以创建出多个线程,一个线程是能属于一个进程,它们之间是一对多的关系,(操作系统能直接管理线程吗?我回答了不能,)

用户级线程与内核级线程的区别

我回答了在运行的状态的优先级上的一些区别。

机器学习的分类算法

简单讲了支持向量机和朴素贝叶斯。

设计模式 与 单例模式代码 (多线程下)

这个参考我上一篇博客吧,面试的时候写了单例模式的单线程版,说了多线程版的思路,忘了加互斥锁的代码怎么写。

https://blog.csdn.net/m0_37896011/article/details/94555407

 

其他就还问了些 你比其他人的优势在哪里。

挂在二面了就,二面确实答的不好,一是准备的不充分,没想过一二面会连在一起面,有些乱了阵脚,下来之后后悔应该能答得更好,二是平时缺乏与同学间交流,跟面试官说的时候逻辑有些混乱。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值