目录
[1. 智能指针讲解](#1. 智能指针讲解)
[2. 智能指针管理对象的方式](#2. 智能指针管理对象的方式)
[3. 大量使用智能指针的代价](#3. 大量使用智能指针的代价)
[4. 结构体中使用智能指针(用 make_shared/make_unique)](#4. 结构体中使用智能指针(用 make_shared/make_unique))
[5. C++ 头文件和源文件分开写的原因](#5. C++ 头文件和源文件分开写的原因)
[6. 是否只使用过 C++?](#6. 是否只使用过 C++?)
[7. 预处理、编译、链接流程](#7. 预处理、编译、链接流程)
[8. map 和 unordered_map 的区别](#8. map 和 unordered_map 的区别)
[9. vector 扩容机制](#9. vector 扩容机制)
[10. 模板讲解](#10. 模板讲解)
[11. 专业是否学这些语言?](#11. 专业是否学这些语言?)
[12. 愿意转语言吗?](#12. 愿意转语言吗?)
[13. 发展规划 / 方向](#13. 发展规划 / 方向)
1. 智能指针讲解
- 核心:C++ 基于 RAII 机制的动态内存管理工具,自动释放对象,避免内存泄漏;
- 种类:
unique_ptr(独占所有权)、shared_ptr(引用计数共享)、weak_ptr(解决循环引用,不占计数)。
2. 智能指针管理对象的方式
- 构造时:获取动态内存(或接管裸指针所有权);
- 生命周期:
unique_ptr独占,析构直接释放;shared_ptr维护引用计数,计数为 0 时释放; - 析构时:自动调用对象析构函数,释放绑定的内存 / 资源。
3. 大量使用智能指针的代价
- 内存开销:
shared_ptr需存储引用计数(额外 4/8 字节),weak_ptr依赖控制块; - 性能开销:
shared_ptr计数增减需原子操作(线程安全但有开销); - 复杂度:
shared_ptr可能引发循环引用,需配合weak_ptr解决;调试成本略高。
4. 结构体中使用智能指针(用 make_shared/make_unique)
-
直接作为成员变量,通过
make_xxx初始化,避免裸new,更安全高效:struct MyStruct {
std::unique_ptr<int> up; // 独占所有权
std::shared_ptrstd::string sp; // 共享所有权
// 初始化
MyStruct() : up(std::make_unique<int>(10)), sp(std::make_sharedstd::string("test")) {}
};
5. C++ 头文件和源文件分开写的原因
- 分离接口与实现:头文件暴露类 / 函数声明(接口),源文件实现逻辑;
- 避免重复编译:头文件加防护(
#pragma once/ifndef),减少编译开销; - 便于模块化:多人协作时,仅需依赖头文件,无需关心实现细节。
6. 是否只使用过 C++?
- 主用 C++,同时了解 Go/Python(根据自身情况调整),能应对跨语言协作场景。
7. 预处理、编译、链接流程
- 预处理:处理
#include/#define,删除注释,生成预处理文件(.i); - 编译:将预处理文件编译为汇编代码(
.s),做语法 / 语义检查、优化; - 链接:将多个目标文件(
.o)+ 库文件合并,解析符号引用,生成可执行文件。
8. map 和 unordered_map 的区别
- 底层:
map红黑树(有序,O (logn) 操作),unordered_map哈希表(无序,平均 O (1)); - 特性:
map自动排序、支持范围查询,unordered_map查询更快但无序、有哈希冲突; - 适用:
map需有序场景,unordered_map追求查询效率。
9. vector 扩容机制
- 扩容时:分配新内存(通常是原容量的 1.5/2 倍),拷贝原数据到新内存,释放旧内存;
- 影响:扩容有拷贝开销,可提前用
reserve(n)预留空间,避免频繁扩容。
10. 模板讲解
- 核心:C++ 泛型编程工具,允许定义 "类型无关" 的类 / 函数,编译期实例化;
- 分类:函数模板(如
std::sort)、类模板(如std::vector); - 优势:代码复用,支持多种类型,无类型转换开销。
11. 专业是否学这些语言?
- 专业课程覆盖 C++ 核心,后续通过项目 / 自学深化,同时拓展相关技术栈(根据自身情况调整)。
12. 愿意转语言吗?
- 愿意!核心能力是编程思维和问题解决,语言是工具,能快速学习 Go/Java 等语言适配工作需求。
13. 发展规划 / 方向
- 短期:深耕 C++ 后端 / 客户端开发,夯实底层基础(内存、并发、网络);
- 长期:向技术专家方向发展,聚焦高性能系统 / 中间件开发,积累复杂项目落地经验。