字节跳动一面面经

字节跳动一面-游戏研发工程师-校招(用时一小时):

数据结构:

  • 讲一下虚函数

虚函数就是在某基类中声明为 virtual并在一个或多个派生类中被重新定义的成员函数。如果在基类中将某个函数指定为虚函数,并且派生类中有另外一个该函数的定义,则编译器将知道我们不是静态连接该函数,而是基于调用该函数的对象种类,在程序的特定位置选择调用哪一个函数。

  • 构造函数和析构函数是否可以用虚函数?为什么?

构造函数不能用虚函数,析构函数可以。

虚函数是通过虚函数表来实现多态的,而虚函数表存储在对象的内存空间。如果构造函数是虚函数,就需要通过虚函数表来调用,但是对象还没有实例化,无法找到虚函数表,所以构造函数不能是虚函数。

在多态时,父类指针指向子类对象,如果此时父类的析构函数不是虚函数,那么就会错误地只执行父类析构函数而不执行子类的析构函数,如果子类有动态分配内存的成员就会造成内存泄露。所以凡是可能成为父类的类,都需要将析构函数设置为虚析构函数。

  • 虚函数表在继承中如何是作用的?

虚函数表指明了类与类的关系,在有虚函数的类的实例中这个表被分配在了对象的内存中,子类对象会复制父类的虚函数表,并将其放在自己的虚函数表的最前面。

  • 讲一下菱形继承是怎么继承的。

两个子类继承同一个父类,而又有子类同时继承这两个子类

  • 用过哪些STL容器?讲一下vector和set的区别。

vector stack queue set map
vector是序列式容器而set是关联式容器。vector底层是数组,set底层是变种红黑树。vector可以随机访问,set不能。vector中的元素可以重复,set不行。

  • 讲一下右值引用。

右值指的是以引用传递而非值传递的方式使用 C++ 右值。

  • 用过vector的emplace_back吗?讲一下完美转发。完美转发是如何实现的?

对应push_back,emplace_back不会涉及到元素的拷贝构造,而同样能将元素放入vector中。
完美转发指的是函数模板可以将自己的参数完美地转发给内部调用的其它函数。所谓完美,即不仅能准确地转发参数的值,还能保证被转发参数的左、右值属性不变。
完美转发使用了引用折叠规则,将传递进来的左值以左值的方式传出,将传递进来的右值以右值的方式传出。

  • 智能指针用过吗?有哪些智能指针?讲一下weak_ptr。

auto_ptr unique_ptr shared_ptr weak_ptr
weak_ptr是为了弥补shared_ptr的问题,当shared_ptr循环引用的时候就会造成引用计数无法归零的情况,这时就要使用弱引用。

  • shared_ptr是怎么实现共享的(说的引用计数用静态数据成员),不对,再想想(没想出来)。

shared_ptr有一个shared_count,由它来管理引用计数区域。

  • 断点调试让程序停在断点怎么实现的?(不清楚,可能是中断,和函数差不多)

通过寄存器和中断实现。

操作系统:

  • 进程和线程的区别?各自的应用场景?

线程是被CPU调度的基本单位,进程是能独立运行的基本单位,是系统分配资源的基本单位
创建销毁线程要比创建销毁进程成本低
进程拥有自己独立的虚拟地址空间,而一个进程中的多个线程共享进程的虚拟地址空间
线程占用的资源比进程少

  • 一个进程有哪几种状态?状态之间怎么转换的?

就绪态、运行态和阻塞态
处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成执行状态。
处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出处理机,于是进程从执行状态转变成就绪状态。
正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成阻塞状态。
处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。

计算机网络:

  • TCP和UDP的区别?(坦白不太会就只问了一个)

TCP提供面向连接的、可靠的数据流传输,而UDP提供的是非面向连接的、不可靠的数据流传输。
TCP传输单位称为TCP报文段,UDP传输单位称为用户数据报。
TCP注重数据安全性,UDP数据传输快,因为不需要连接等待,少了许多操作,但是其安全性却一般。

数据库:

  • 看你项目用了数据库,讲一下数据库的底层实现(b树,b+树),讲下它们的区别。

B树的每个节点都存储键值和数据且键值是唯一的。而B+树只在叶子节点存储数据,键值不唯一。B+树可以按顺序依次访问叶子结点,B树不行。
B+树改进了B树, 让内结点只作索引使用, 去掉了其中指向数据的指针, 使得每个结点中能够存放更多的键值, 因此能有更大的出度. 这样就意味着存放同样多的键值, 树的层高能进一步被压缩, 使得检索的时间更短。

项目:

  • 看你在写毕业设计,用虚幻四写个游戏,这是个什么类型游戏?(开放世界,开发了一半)你做了哪些东西(人物动画绑定,动画融合,透视材质,粒子特效-人物溶解特效),你还计划做哪些东西?(worldcreator做地编,交互,NPC行为等等)

题目:

  • 红黄蓝三个盒子,随机装红黄蓝三个球,颜色全部不对有几种情况?讲一下怎么做的。

编程题(现场写):

  • 在二维空间内按顺序给一系列的点存在vector里(struct{double x,double
    y}),把这些点连起来,得到一条折线段,再给个长度s,从起点开始沿着这条线段前进,每隔s距离做一个标记,输出所有被标记的点(存在vector里),起点算第一个被标记的点。

总结:一面感觉压力山大,除了数据结构其他答的都磕磕巴巴的,代码题也只写了一部分,总体不太好,不知道还有没有二面了。自己需要补一下网络编程和计算机网络那一块,复习一下操作系统,力扣每日一题还得刷,现场写代码太紧张了(重要提示,平时写算法题的时候一定不要用本地的编译器,要用网页给的编译器!!!让你写代码的时候是没有实时语法报错和大部分的联想功能的!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值