我正在查看 std::vector 代码,发现了一些我不太明白的东西。当容量 < size() + 1 时,它需要重新分配缓冲区以便插入新元素。它的作用(据我能够从代码中提取)是:
- 分配新的缓冲区
- 复制旧缓冲区的前缀(0 - 插入索引)
- 在新缓冲区中构造新元素
- 复制旧缓冲区的后缀(索引 - 结束)
- 对旧缓冲区中的所有项目调用析构函数
- 释放旧缓冲区
据我所知,前缀和后缀副本是用 memmove 完成的。memmove 不是数据的纯二进制副本吗?它不调用元素的构造函数,是吗?我想知道的是,如果内存只是被移动,而不是在新缓冲区中重新构造,为什么函数会在旧缓冲区中的元素上调用析构函数?