快手游戏服务端C++开发一面-面经总结

devtools/2024/10/17 21:31:23/

1、tcp的重传机制有哪几种?具体描述一下

最基本的超时重传 超过时间就会重传
三个重复ACK 快速重传 减少等待超时、
接收方可以发送选择性确认 不用重传整段
乱序到达 可以通知哪些丢失 重复数据重传

2、override和final?

override可写可不写
写出来就是显式声明 虚函数 重写基类了 更加清晰

void doSomething(int x) override {  // 使用 override 关键字// 派生类中的实现}

final是最后一代的意思 没办法继续继承了 无法被重写了的意思

3、epoll的边缘触发和水平触发?

水平是默认的-这个没有疑问,只要fd有没有处理的事件,就不断通知应用程序。

假设一个套接字上有数据可读,水平触发模式下,只要该套接字上还有数据可读,每次调用 epoll_wait 都会返回该事件,直到数据被完全读取。逐步处理数据的场景。

边缘触发:高效爱的,减少系统调用次数,仅仅状态变化才通知一次。
从无到有才能通知一次。适用于事件发生立即处理大量的数据。减少重复通知。必须干完才能给你新派活。

4、tcp的滑动窗口?

滑动窗口为了流量控制
发送方和接收方之间动态调整发送和接受速度 防止网络拥塞和丢包
先商定初始窗口大小----不超过窗口范围发送数据包-----ack返回能接受的大小----滑动到新的窗口发送新的数据。

5、stl的常用容器及其底层实现数据结构?

vector:动态数组 增长是两倍增长
deque:双端队列(链表)
list:双向链表
queue:一般用deque 也可以list
set:红黑树 自平衡二叉查找树 set不重复
map:红黑树 键值对
unordered_set 和 unordered_multiset:哈希表 无序 平均o1 最坏o1

6、static的用法和作用?

函数内静态变量:只初始化一次 它在函数调用结束后依然存在,并在下次调用时保留上次的值。

void counter() {static int count = 0;  // 只初始化一次count++;std::cout << "Count: " << count << std::endl;
}int main() {counter();  // 输出: Count: 1counter();  // 输出: Count: 2counter();  // 输出: Count: 3return 0;
}

上面的例子可以看出来 每次调用counter函数 都不会把他置为0 而是保持上一次不变了 才能加

全局静态变量-全局静态函数:作用域限制在自己的文件 不能被其他文件访问 防止冲突 (命名)

类中的静态变量 静态成员函数:这就是归为类 而不是某个实例的属性了 不实例化 Example 类的情况下直接通过类名调用。

7、智能指针?

这个不写了 感觉是必考

8、虚函数、虚表指针?

有虚函数就有虚表
虚表里面是虚函数地址
虚表指针指向虚表
通过虚表指针找到虚表 找到对应的函数指针 再调用函数

每个 Base 对象有一个 vptr,指向 Base_vtable;
每个 Derived 对象有一个 vptr,指向 Derived_vtable。
调用虚函数时,通过对象的 vptr 指针确定实际调用的函数。

class Base {
public:virtual void func1() { /* ... */ }virtual void func2() { /* ... */ }
};class Derived : public Base {
public:void func1() override { /* ... */ } // 重写基类的 func1void func3() { /* ... */ } // 派生类独有的函数
};对于 Base 类,它的虚表可能看起来像这样:Base_vtable:
+---------------------+
| Base::func1 address |
+---------------------+
| Base::func2 address |
+---------------------+而对于 Derived 类,它的虚表可能看起来像这样:Derived_vtable:
+---------------------+
| Derived::func1 address | // 重写后的函数地址
+-----------------------+
| Base::func2 address    | // 没有重写,指向基类的函数地址
+-----------------------+

9、内存碎片?

不能有效利用的零散空间 影响系统性能和使用效率
有两种:外部碎片 内部碎片

外部碎片指的是由于内存块的分配和释放操作导致可用的空闲内存被分割成许多小块,这些小块分布在整个内存空间中,而每个小块都不足以满足新的内存分配请求。即便系统总的空闲内存足够,但因为它们不连续,导致无法分配给需要较大连续空间的请求。

内部碎片指的是分配的内存块内部未被使用的部分。由于内存分配器一般会按照一定的对齐要求(如8字节或16字节对齐)来分配内存,所以分配的内存块可能会比实际需要的稍大,导致一部分内存未被使用。

10、索引的优缺点?

优点:加速检索 提高效率 可以条件查询
缺点:增加空间 降低写入性能 还要维护 有可能失效

11、索引可以用哪些数据结构实现?

B树 多路搜索自平衡搜索树
B+树 变种 叶子节点怎么怎么样
哈希表
跳表(多层链表 查找变成logn)
前缀树trie 就是用于前缀匹配

236. 二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root == nullptr || root == p || root == q) return root;TreeNode *left = lowestCommonAncestor(root->left, p, q);TreeNode *right = lowestCommonAncestor(root->right, p, q);if(left == nullptr) return right;if(right == nullptr) return left;return root;}
};

http://www.ppmy.cn/devtools/126565.html

相关文章

T10 tensorflow数据增强

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 T10 使用 TensorFlow 实现数据增强 在深度学习的图像分类任务中&#xff0c;数据增强是一种常用的技术&#xff0c;它通过对现有训练样本进行随机变换&#…

使用人体关键点驱动FBX格式虚拟人原理【详解】

文章目录 1、使用人体关键点数据驱动FBX格式虚拟人的总流程2、使用mediapipe检测人体关键点和插值平滑2.1 mediapipe检测人体关键点2.2 人体关键点的插值平滑 3、将2d关键点转为3d关键点4、旋转矩阵4.1 旋转矩阵4.2 旋转矩阵转为四元数 5、将旋转矩阵用于虚拟人的驱动5.1 基础旋…

Linux 操作系统——扫盲教程5

目录 更多的 Machine Related 指令 useradd passwd ps top nice pgrep ifconfig iostat iotop mpstat vmstat 更多的 Machine Related 指令 useradd 各位如果有自己装Linux发行版的经验&#xff0c;就会知道我们的操作系统需要注册一个用户&#xff0c;我们登陆上…

中国全国省市区县汇总全国省市区json省市区数据2024最新

简介 包含全国省市区县数据,共3465个。 全国总共有23个省、5个自治区、4个直辖市、2个特别行政区。 ——更新于2024年10月16日,从2017年开始,已经更新坚持7年 从刚开始1000个左右的城市json,到现在全国省市区县3465个。 本人感觉应该是目前最完善的~ 每年都在更新中,…

外包功能测试干了6个月,技术退步太明显了。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;23年通过校招进入武汉某软件公司&#xff0c;干了差不多6个月的功能测试&#xff0c;今年中秋&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我就在一个外包企业干了6个月的功…

Python网络爬虫

随着互联网的迅猛发展&#xff0c;数据成为了新的“石油”。人们对于信息的需求日益增涨&#xff0c;尤其是在市场分析、学术研究和数据挖掘等领域。网络爬虫作为一种自动提取网络数据的技术&#xff0c;因其强大的能力而备受关注。而Python&#xff0c;凭借其简洁的语法和丰富…

【一个简单的JavaScript网页设计案例】

首先&#xff0c;我们需要一些HTML来构建基本的页面结构&#xff0c;接着是一些CSS来美化页面&#xff0c;最后是JavaScript来实现功能。 HTML (index.html) <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <…

使用API有效率地管理Dynadot域名,删除域名服务器(Name Server)

前言 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…