C++面试指南:操作系统、设计模式重点解析

需积分: 9 5 下载量 198 浏览量 更新于2024-07-16 收藏 873KB PDF 举报
"面试-C++操作系统数据库设计模式" 这篇文档主要涵盖了面试中常见的C++、操作系统和设计模式的相关问题,适合准备华为、中兴、海康、大华、小米、vivo等公司面试的人员阅读。以下是这些知识点的详细解释: 1. **C++源文件编译过程**: C++源代码经过预处理、编译、汇编和链接四个步骤,最终形成可执行文件。 2. **`#include`尖括号和双引号的区别**: 尖括号用于寻找系统头文件,双引号用于寻找用户指定的头文件路径。 3. **线程与进程**:线程是进程内的执行单元,相比进程,线程更轻量级,通信效率更高,但共享资源可能导致竞态条件。 4. **C++11新特性**:包括右值引用、lambda表达式、auto类型推断、强类型枚举、move语义等。 5. **malloc、brk和mmap**:malloc通过调整堆内存分配;brk系统调用改变数据段的边界;mmap用于从文件或设备映射内存。 6. **static关键字**:在不同作用域中,static表示静态存储持续性或限制作用域。 7. **C++与C的区别**:C++支持面向对象编程,包含类、继承、多态等特性;C是过程式语言。 8. **C++的cast转换**:包括static_cast、dynamic_cast、const_cast和reinterpret_cast。 9. **指针与引用**:指针可以为空,可以被赋值,可以改变指向;引用一旦初始化就不能改变,但可作为函数参数和返回值。 10. **智能指针**:如std::unique_ptr、std::shared_ptr,自动管理对象生命周期,防止内存泄漏。 11. **野指针**:未初始化或已释放的对象指针,可能导致未定义行为。避免方法是始终初始化指针并正确管理内存。 12. **析构函数**:负责对象销毁前的清理工作,虚析构函数确保子类对象在派生链中正确销毁。 13. **fork函数**:创建一个与父进程相同的子进程,二者共享地址空间但拥有独立的进程标识符。 14. **重载和覆盖**:重载在同一作用域内不同参数列表的同名函数;覆盖是指基类虚函数在派生类中的重新定义。 15. **strcpy、strlen、strcat和strcmp**:字符串操作函数,用于复制、计算长度、连接和比较字符串。 16. **虚函数与多态**:虚函数实现动态绑定,支持多态性,允许基类指针调用派生类的成员函数。 17. **const修饰成员函数**:确保函数不会修改对象状态,提高代码安全性。 18. **extern"C"**:在C++中用于链接C语言编译的代码,保持C语言的链接兼容性。 19. **new/delete与malloc/free**:new和delete处理对象的构造和析构,malloc和free仅分配和释放原始内存。 20. **虚函数表**:存储类中虚函数地址的表格,实现运行时多态。 21. **C函数调用**:通过栈传递参数,返回值通常放在EAX寄存器。 22. **C++返回值处理**:可能涉及构造函数和析构函数调用,以及值复制或移动语义。 23. **拷贝赋值函数**:应避免浅拷贝,推荐使用深拷贝或禁止拷贝。 24. **Volatile关键字**:指示变量的值可能由外部不可见的因素更改,要求每次读取都从内存中获取。 25. **Inline内联函数**:为了减少函数调用开销,将函数体插入到每个调用处。 26. **map和set**:map是键值对集合,set是唯一元素集合,两者都基于红黑树实现。 27. **STL的allocator**:管理内存分配,vector通过连续内存存储元素。 28. **STL迭代器删除元素**:删除后,迭代器可能失效,需谨慎操作。 29. **STL的基本组成**:包括容器(如vector、list)、迭代器、算法和分配器。 30. **vector和list的区别**:vector支持随机访问,list支持高效插入删除,但遍历速度慢。 31. **迭代器和指针**:迭代器模拟指针行为,但具有更多功能,如自增、解引用等。 32. **resize和reserve**:resize改变容器大小,可能添加默认构造元素;reserve只为容器预留空间,不改变元素数量。 33. **访问权限**:C++类成员有public、private和protected三种访问级别。 34. **struct和class的区别**:主要在于默认访问权限,struct默认public,class默认private。 35. **类内引用成员**:C++标准允许在类中定义引用成员,但必须在构造函数中初始化。 36. **右值引用**:用于临时对象和移动语义,与左值引用(常规变量)区分,便于高效转移所有权。 37. **内存泄漏**:程序分配的内存未能正确释放,导致资源浪费。 38. **进程与线程**:进程是资源分配的最小单位,线程是CPU调度的最小单位,进程间通信复杂,线程间通信直接。 39. **Linux虚拟地址空间**:每个进程都有自己独立的4GB地址空间,分为栈、堆、代码、数据和共享库等区域。 40. **缺页中断**:当进程尝试访问的页不在内存中时,操作系统触发缺页异常,执行页面替换策略。 41. **fork与vfork**:fork创建完全独立的子进程,vfork共享父进程的地址空间,直至子进程调用exec或exit。 42. **并发与并行**:并发在同一时间段内交替执行多个任务,而并行是同一时间执行多个任务。 43. **页表寻址**:操作系统使用页表将虚拟地址映射到物理地址,实现地址转换。 44. **单核多线程**:虽然不能同时执行,但线程切换可以在I/O等待期间执行其他任务,提高CPU利用率。 45. **线程上下文**:包括寄存器状态(如SP、PC、EAX等)和其他线程特定信息,线程切换时需要保存这些状态。 46. **OS缺页置换算法**:如LRU(最近最少使用)、FIFO(先进先出)、OPT(最佳)等,选择合适的页面替换策略。 以上内容详细阐述了C++的基础概念、操作系统原理和设计模式的基础知识,对于理解和解答面试中的相关问题具有很高的参考价值。