cvte校招提前批 c++开发面经

cvte校招提前批 c++开发面经
最新回答
避讳真心

2026-04-04 04:34:22

CVTE校招提前批C++开发面经总结如下,结合面试问题分类解析,并补充关键知识点:

一、网络相关问题
  1. 网络排查工具使用

    常用工具:ping(测试连通性)、telnet(端口检测)、tcpdump/Wireshark(抓包分析)、netstat(查看网络状态)、traceroute(路由追踪)。

    应用场景:若客户端与服务器未建立连接,可通过以下步骤排查:

    检查物理层(网线、网卡状态)和网络配置(IP、子网掩码、网关)。

    使用ping测试基础连通性,若失败则排查防火墙或路由问题。

    通过telnet <IP> <port>验证端口是否开放,若失败可能是服务未启动或防火墙拦截。

    使用tcpdump抓包分析三次握手是否发起或被丢弃。

  2. TCP第一次握手未收到第二次的排查

    可能原因:

    服务器未收到SYN包(网络丢包、防火墙拦截)。

    服务器收到SYN但未回复SYN-ACK(资源耗尽、代码逻辑错误)。

    排查方法:

    客户端抓包确认SYN是否发出。

    服务器端检查netstat -an | grep SYN_RECV是否有半连接堆积。

    调整内核参数(如tcp_synack_retries)或检查服务器负载。

  3. 浏览器输入网址的流程

    DNS解析:查询域名对应的IP地址(本地缓存→本地DNS→根DNS→权威DNS)。

    TCP连接:三次握手建立连接。

    TLS握手(HTTPS):协商加密算法、交换密钥。

    HTTP请求:发送GET/POST请求,服务器返回响应。

    渲染页面:解析HTML/CSS/JS,渲染为可视化界面。

  4. gRPC的作用

    基于HTTP/2的高性能RPC框架,支持多语言(C++、Java、Go等)。

    核心特性:

    协议缓冲区(Protobuf)定义接口,强类型、高效序列化。

    支持双向流、负载均衡、服务发现。

    跨平台、跨语言通信,适用于微服务架构。

  5. TCP粘包问题

    原因:TCP是流式协议,无消息边界,多次发送的数据可能被合并接收。

    解决方案:

    固定长度:每条消息长度固定,不足补空格。

    分隔符:使用特殊字符(如n)分隔消息。

    头部标识:在消息前添加长度字段(如Protobuf的length-delimited格式)。

二、操作系统相关问题
  1. 进程的内存空间

    分段:代码段(只读)、数据段(全局/静态变量)、堆(动态内存分配)、栈(局部变量、函数调用)。

    分页:虚拟内存通过页表映射到物理内存,支持按需加载和隔离。

  2. 多线程按顺序打印数据

    方法:使用条件变量(std::condition_variable)或信号量控制线程执行顺序。

    示例代码:

    std::mutex mtx;std::condition_variable cv;int current = 0;void print(int id, int total) { std::unique_lock<std::mutex> lock(mtx); while (current != id) { cv.wait(lock); } std::cout << "Thread " << id << std::endl; current++; cv.notify_all();}
  3. 死锁的实现与避免

    死锁条件:互斥、占有并等待、非抢占、循环等待。

    避免方法:

    按固定顺序申请锁(如先锁A再锁B)。

    使用std::lock同时锁定多个互斥量。

    设置超时(std::timed_mutex)。

    避免嵌套锁。

  4. 大端存储与小端存储

    大端(Big-Endian):高位字节存储在低地址(如网络字节序)。

    小端(Little-Endian):低位字节存储在低地址(如x86架构)。

    检测方法:

    bool isLittleEndian() { int num = 1; return *(char*)&num == 1;}
  5. 防止锁忘记释放

    RAII原则:使用std::lock_guard或std::unique_lock自动释放锁。

    示例:

    std::mutex mtx;{ std::lock_guard<std::mutex> lock(mtx); // 离开作用域自动释放 // 临界区代码}
三、C++相关问题
  1. 虚函数与虚表

    虚表(vtable):每个包含虚函数的类有一个虚表,存储虚函数指针。

    虚指针(vptr):对象实例中隐藏的指针,指向类的虚表。

    调用过程:通过vptr找到虚表,根据索引调用虚函数(动态绑定)。

  2. static的作用

    类内静态成员:所有实例共享,需在类外初始化(如int MyClass::count = 0;)。

    静态函数:无this指针,只能访问静态成员。

    局部静态变量:函数内声明,生命周期延长至程序结束(线程安全需额外处理)。

  3. 空类默认函数

    编译器自动生成:默认构造函数、默认析构函数、默认拷贝构造函数、默认赋值运算符。

    若用户定义:如定义了构造函数,则不再生成默认拷贝构造函数。

  4. 设计模式图绘制

    常见模式:

    单例模式:类图展示私有构造函数和静态实例方法。

    观察者模式:类图展示主题(Subject)和观察者(Observer)的关联。

    工具:使用PlantUML或StarUML绘制UML类图。

  5. shared_ptr原理与使用

    原理:通过引用计数管理动态内存,计数为0时自动释放。

    使用注意:

    避免循环引用(用std::weak_ptr打破)。

    优先使用std::make_shared而非直接new。

    禁止混用原始指针和智能指针。

  6. vector原理

    底层实现:动态数组,连续内存存储元素。

    扩容机制:当容量不足时,按1.5倍或2倍扩容(具体实现依赖标准库)。

    性能:随机访问O(1),插入/删除末尾O(1),中间O(n)。

四、面试建议
  1. 项目经验:重点准备项目中的技术难点、优化方案和收获。
  2. 八股文:结合《C++ Primer》《Effective C++》等书籍系统复习。
  3. 模拟面试:通过牛客网等平台练习真题,熟悉面试节奏。
  4. 心态调整:即使收到感谢信也不气馁,总结问题并针对性改进。

参考资源:牛客网面试经验板块、GitHub开源项目(如《C++面试题汇总》)、LeetCode刷题。