为什么矢量调整大小不会移动其内容?我可以强迫它吗?

时间:2016-11-24 12:04:35

标签: c++ vector move c++17

当达到::std::vector<T>的容量且插入了其他元素时,在重新分配大部分内存后,似乎::std::vector<T> 复制构造数据。

如果我们有一个vector<vector<vector<int>>>,这似乎非常低效,因为必须对整个内容进行深度复制。如果移动语义被利用,则开销(通常)每个条目都是常量,而不是无限制。

问题(S)

  1. 为什么会这样做?
  2. 我可以强制它::std::move内容吗?
  3. 实施例

    为了分析这一点,我实现了一个小型包装器类型DataPrinter,每个构造/销毁都包含charcout::std::vector<DataPrinter> v; ::std::cout << "emplacing a\n"; v.emplace_back('a'); ::std::cout << "emplacing b\n"; v.emplace_back('b'); ::std::cout << "emplacing c\n"; v.emplace_back('c'); emplacing a [0x60200000eff0] DataPrinter(a) emplacing b [0x60200000efd1] DataPrinter(b) [0x60200000efd0] DataPrinter(DataPrinter[a]const &) [0x60200000eff0] ~DataPrinter[a]() emplacing c [0x60200000efb2] DataPrinter(c) [0x60200000efb0] DataPrinter(DataPrinter[a]const &) [0x60200000efb1] DataPrinter(DataPrinter[b]const &) [0x60200000efd0] ~DataPrinter[a]() [0x60200000efd1] ~DataPrinter[b]() 。我明白了:

    clang++ 3.5.0-10

    我正在使用-fsanitize=address -std=c++1zfunction openNav() { $("#navBar").show(1000); } function closeNav() { $("#navBar").hide(); } 构建。

0 个答案:

没有答案