gpt4 book ai didi

c++ - std::vector insert() 重新分配

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:13 25 4
gpt4 key购买 nike

我查看了 std::vector 代码,发现了一些我不太明白的东西。当 capacity < size() + 1 时,它需要重新分配缓冲区以便插入新元素。它的作用(据我能够从代码中提取的)是:

  • 分配新缓冲区
  • 复制旧缓冲区的前缀(0 - 插入索引)
  • 在新缓冲区中构造新元素
  • 复制旧缓冲区的后缀(index - end)
  • 对旧缓冲区中的所有项目调用析构函数
  • 释放旧缓冲区

据我所知,前缀和后缀的复制是用 memmove 完成的。 memmove 不是数据的纯二进制拷贝吗?它不会调用元素的构造函数,是吗?我想知道的是,如果内存只是移动,而不是在新缓冲区中重新构造,为什么函数会调用旧缓冲区中元素的析构函数?

最佳答案

我查看了 MSVC8 vector实现 - 我看不到 memmove() .先前的 vector 元素不会移动,它们会被复制并调用它们的复制函数将它们复制到新缓冲区(缓冲区是在单个分配中分配的,元素是使用放置新构造的)。

当然这只是 MSVC 实现,但它是一个 vector 的实现方式应该按照标准行事。

但是,使用 memmove有时是可以的 - 例如 std::vector<int> - 并且 STL 实现可以免费专门针对这种情况。您可能错过了阅读源代码的模板“分支”。

关于c++ - std::vector insert() 重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2127325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com