涉及到了手动内存管理、堆分配以及模板类的深层逻辑。
简要概述#
- 核心目标:实现动态扩容
- 作者明确了本集的目标:创建一个可以根据需要自动增长内存空间的容器,模拟
std::vector的核心行为。
- 作者明确了本集的目标:创建一个可以根据需要自动增长内存空间的容器,模拟
- 成员变量的改变:从栈到堆
- 不再使用
T m_Data[S],而是改为T* m_Data指针。 - 引入两个关键计数器:
m_Size(当前元素个数)和m_Capacity(当前分配的总空间)。
- 不再使用
- 构造函数与析构函数
- 在构造函数中预分配一小块初始内存。
- 强调了析构函数的重要性:必须使用
delete[] m_Data释放堆内存,否则会导致内存泄漏。
- 实现
PushBack方法(核心逻辑)- 这是本集最精彩的部分:当
m_Size >= m_Capacity时,触发“重新分配(Reallocation)”。 - 扩容策略:作者演示了将容量翻倍(
m_Capacity * 2)的常用工程策略。
- 这是本集最精彩的部分:当
- 手动执行内存迁移
- 详细步骤:申请一块更大的新内存 -> 将旧数据拷贝到新内存 -> 释放旧内存 -> 指针重定向。
- 模板化的挑战
- 讨论了为什么 Vector 需要模板化,以及在处理非简单类型(如
std::string)时,简单的拷贝可能会失效(引出对后续移动语义的思考)。
- 讨论了为什么 Vector 需要模板化,以及在处理非简单类型(如
- 性能测试与优化预告
- 对比了自定义 Vector 与标准库
std::vector的性能。 - 提到目前的实现虽然可用,但频繁的拷贝开销巨大,引出后续关于
emplace_back的话题。
- 对比了自定义 Vector 与标准库