我正在阅读c++ primer move部分,对move的实现感到困惑。
假设我们有一个向量,它有4个元素,占用了4个连续的内存位置。MEM0~3。向量的容量为4。
假设MEM4现在不可用,因为它被另一个线程或程序占用,或者由于某种原因。这个是可能的吗?
现在我们需要添加另一个元素。因为我们必须保持连续的内存,所以我们只能找到另一块可以容纳8个向量条目的连续内存,例如MEM5~12。通过这种方式,我们确实将内容从MEM0~3复制到MEM5~8,然后在MEM9处添加新元素,对吗?
我们没有办法重用旧的MEM0~3并在保持连续地址的同时增加容量。
如果它是链表,我可以理解移动。但是对于像这样的数组,我有点困惑。请帮我解释一下。谢谢。
发布于 2021-04-13 08:19:03
这完全超出了C++标准的范围。
该标准中没有禁止这种优化的内容。当然可能的是,特定的C++实现确定可以扩展已经用完其reserve()d容量的std::vector,而无需分配更大的存储空间并将矢量的现有内容移动到更大的分配存储空间中。
如果是这样,那么这是一个非常合理的优化。但C++标准中也没有任何内容需要这种特定的优化。考虑到std::vector的存储扩展算法已经要求所得到的向量插入必须具有恒定的分期时间复杂度,所以可以合理地得出结论,跟踪这种细节级别的存储器分配的额外复杂度可能仅产生边际增益,以换取更大的总体开销,并且实际上可能在总体上产生更多开销。
https://stackoverflow.com/questions/67067129
复制相似问题