极氪 - 嵌入式软件开发 - 一面
全程面试一小时四十分钟,两个面试官轮番上阵,部门主要做车端底层软件和中间件。面试难度整体不大,主要深挖在蔚来的实习项目,八股问题相对常见,无奈问题量很大,最后已经很疲劳了。
Intern & ourea_app:
- 介绍一下 cgroup 原理及其难点
- 项目需要加载哪些配置文件
- 懒汉和饿汉单例模式有什么区别
- 为什么项目使用懒汉单例(看起来饿汉单例更合适)
- 还了解哪些设计模式(单例、工厂、装饰者)
- 如果一个 app CPU 占用率超过限定值,cgroup 是如何进行限制的,服务会被 kill 掉吗?
- 如何解析 coredump(minidump)
- minidump 解析原理是什么
- 使用 perf 进行性能分析,如何生成火焰图?能否实时生成火焰图?
OS:
- select 和 epoll 的区别
- 实现一个线程池分为哪些步骤
- 互斥锁和自旋锁的区别
Network:
- TCP 和 UDP 的区别
- 介绍一下 TCP 四次挥手
- 为什么需要 TIME_WAIT 状态
- TIME_WAIT 时间是多长(2MSL)
C++:
- 多态实现原理
- 虚函数表是在什么时候创建的
- 从编译器角度来看、静态多态(函数重载)原理是什么
- STL vector 中
push_back
和emplace_back
的区别 - map 和 unordered_map 的区别、以及适用场景
- 如何使 Map 中的 Key 按照自定义规则排序
#include <>
和""
的区别- 深拷贝和浅拷贝的区别
strcpy
会造成什么安全问题strcpy
和memcpy
的区别- 使用
memcpy
会造成哪些隐患 memcpy
和memmove
的区别- delete 能否用于释放整型变量
fork
和vfork
的区别
LeetCode:
- 实现一个简单的
string
类
#include <iostream> #include <vector> #include <string.h> #include <stdio.h> using namespace std; class MyString { public: MyString() : _data(nullptr), _len(0) {} MyString(const char* str) { if (str) { _len = strlen(str); _data = new char[_len + 1]; strcpy(_data, str); } else { _len = 0; _data = nullptr; } } MyString(const MyString& other) { _len = other._len; _data = new char[_len + 1]; strcpy(_data, other._data); } MyString& operator=(const MyString& other) { if (this != &other) { delete[] _data; _len = other._len; _data = new char[_len + 1]; strcpy(_data, other._data); // deep copy } return *this; } MyString& operator+=(const MyString& other) { int new_len = _len + other._len; char* new_data = new char[new_len + 1]; strcpy(new_data, _data); strcat(new_data, other._data); delete[] _data; _len = new_len; _data = new_data; return *this; } bool operator==(const MyString& other) { if (_len != other._len) { return false; } return strcmp(_data, other._data); } ~MyString() { delete[] _data; _len = 0; } private: char* _data; int _len; };#面经##软件开发2024笔面经#