相关疑难解决方法(0)

为什么C++分配器中没有重新分配功能?

在C中,标准内存处理函数是malloc(),realloc()free().但是,C++ stdlib分配器只兼容其中两个:没有重新分配功能.当然,不可能完全相同realloc(),因为简单地复制内存不适合非聚合类型.但是,这个函数是否会出现问题:

bool reallocate (pointer ptr, size_type num_now, size_type num_requested);
Run Code Online (Sandbox Code Playgroud)

哪里

  • ptr先前为num_now对象分配了相同的分配器;
  • num_requested> = num_now;

和语义如下:

  • 如果分配器可以ptr从给定num_now对象的大小扩展给定的内存块num_requested,它会这样做(留下额外的内存未初始化)并返回true;
  • 否则它什么都不做并返回false.

当然,这不是很简单,但据我所知,分配器主要用于容器和容器的代码通常很复杂.

给定这样的函数,std::vector比如说,可以增长如下(伪代码):

if (allocator.reallocate (buffer, capacity, new_capacity))
  capacity = new_capacity;     // That's all we need to do
else
  ...   // Do the standard reallocation by using a different buffer,
        // copying data and freeing the current one …
Run Code Online (Sandbox Code Playgroud)

c++ memory-management realloc

33
推荐指数
3
解决办法
3829
查看次数

减少stl向量的容量

有没有办法减少矢量的容量?

我的代码将值插入到向量中(事先不知道它们的数字),当这完成时,向量仅用于读取操作.

我想我可以创建一个新的向量,用大小做一个.reseve()并复制项目,但我真的不喜欢额外的复制操作.

PS:我不关心便携式解决方案,只要它适用于gcc.

c++ stl vector

26
推荐指数
4
解决办法
2万
查看次数

shrink_to_fit是减少`std :: vector`到其大小的容量的正确方法吗?

在C++ 11 shrink_to_fit是引入补充某些STL容器(例如,std::vector,std::deque,std::string).

Synopsizing,其主要功能是请求与之关联的容器,以减少其容量以适应其大小.但是,此请求是非绑定的,并且容器实现可以自由地进行优化,并使向量的容量大于其大小.

此外,在之前的SO问题中,OP不鼓励使用它shrink_to_fit来减小其容量std::vector.不这样做的理由如下:

shrink_to_fit什么都不做,或者它给你缓存局部性问题,并且执行O(n)(因为你必须将每个项目复制到他们新的较小的家庭).通常,将松弛留在内存中会更便宜.@Massa

有人可以如此善意地解决以下问题:

  • 报价中的参数是否成立?
  • 如果是的话,将STL容器的容量缩小到适当大小的正确方法什么(至少对于std::vector).
  • 如果有更好的方法来缩小容器,那么后续存在的原因是什么shrink_to_fit

c++ stl vector c++11

24
推荐指数
2
解决办法
1万
查看次数

std :: vector.pop_back()是否会改变向量的容量?

如果我使用resize()reserve()在程序开始时将std :: vector分配给某个大小和容量,是否有pop_back()可能"破坏"保留容量并导致重新分配?

c++ memory-management stl vector

14
推荐指数
1
解决办法
5855
查看次数

我们可以依靠减少容量的技巧吗?

它实际上是否保证以下减少容量技巧将"起作用"?

int main() {
   std::string s = "lololololol";
   s = "";                        // capacity still non-zero

   string(s).swap(s);             // ?
}
Run Code Online (Sandbox Code Playgroud)

它对我来说似乎没有"起作用"(因为容量仍然不为零),而且我在标准中找不到任何东西,而不是"内容"必须在两者之间交换[这里,相同的]对象.

同样,对于序列容器:

int main() {
   vector<int> v { 1,2,3,4,5 };
   v.clear();                   // capacity still non-zero

   vector<int>(v).swap(v);      // ?
}
Run Code Online (Sandbox Code Playgroud)

据我所知,这个"技巧"是半广泛使用的; 也许这种广泛采用是错误的?

(当然,在C++ 11中,我们shrink_to_fit[虽然没有绑定],但是这种做法没有实际意义.)

c++ std

8
推荐指数
1
解决办法
1286
查看次数

具有反向成本和pop / push_back成本的STL向量

我不能很好地算出算法成本,所以我在这里问。

这是一个初始使用1000个元素初始化的向量:

vector<unsigned int> mFreeIndexes(1000);
Run Code Online (Sandbox Code Playgroud)

我将持续将pop_back / push_back元素添加到向量中,但绝不会将push_back超过1000个(因此绝不要强迫向量重新分配)。

在这种情况下,pop_back / push_back操作是O(1)还是O(n)?

c++ stl

5
推荐指数
1
解决办法
552
查看次数

如何确保 std::vector 不会被重新分配?

我知道在向量上使用 push_back() 时,该向量可能会被重新分配(如果没有剩余空间)以获得更多空间。使用 pop_back() 时,是否可以重新分配向量,以释放未使用的空间?

一般来说,在使用 push_back() 和 pop_back() 操作序列时,我能否以某种方式确保我的向量不会被重新分配(假设我知道它的最大容量)?这种重新分配使我的指针和迭代器无效并导致问题。

c++ memory vector push-back

2
推荐指数
1
解决办法
78
查看次数

标签 统计

c++ ×7

stl ×4

vector ×4

memory-management ×2

c++11 ×1

memory ×1

push-back ×1

realloc ×1

std ×1