std::vector的memory/runtime效率是多少,它的内存分配策略是什么?
What is the memory/runtime efficiency of std::vector, and what is its memory allocation strategy?
我正在看《C++ Primer》,在关于容器的章节中,书上建议尽可能使用std::vector
,例如当不需要在中间或前面插入或删除时。
我用std::vector
测试了一下,发现每次需要重新分配时,它总是重新分配一块比以前大三倍的内存。不知道是不是总是这样,为什么会这样执行。
此外,std::vector
的memory/time效率与内置的静态和动态数组相比如何?为什么这本书建议总是使用 std::vector
,即使在一个简单的静态数组可以处理的简单场景中也是如此?
why would it execute in such a way
因为尽管这会浪费一些内存,但它通过减少重新分配的次数使插入速度更快。
它将 push_back
的复杂度保持在分摊的 O(1) 下,同时将大小增加 1 并每次重新分配将使它成为 O(n)。
reallocates a piece of memory that is three times larger than its previous size. I wonder if this is always the case
标准只是说 push_back
必须分摊 O(1) 复杂度,编译器(更准确地说,标准库实现)可以通过任何方式自由实现。
这不允许每次将容量增加 1,因为这会使复杂度为 O(n)。显然 achieving amortized O(1) requires the size to be increased by N times, but N can have any value. As show ,N 可以在插入之间保持谨慎,通常在 1.5 和 2 之间。
memory/time efficiency of std::vector compared to built-in static and dynamic arrays?
访问速度应该差不多。插入和移除速度无法比较,因为数组具有固定大小。向量可能会使用更多内存,因为正如您所注意到的,它们可以为它们实际拥有的更多元素分配内存。
Why would the book suggest always using std::vector even in a simple scenario which a simple static array could handle?
不需要用向量替换固定大小的数组,只要静态数组足够小以适合堆栈即可。
应使用 std::vector
而不是使用 new
手动分配数组,以减少内存泄漏和其他错误的风险。
I tested a bit with std::vector and noticed that every time it needs to reallocate, it always reallocates a piece of memory that is three times larger than its previous size. I wonder if this is always the case, and why would it execute in such a way.
就上下文而言,调整已填充可调整大小容器大小的可能重新分配策略是将其大小加倍,以免完全失去 O(1)
插入时间复杂度,因为重新分配时间复杂度为 O(N)
。
重新分配次数的对数特性使得这个插入操作不会失去它的倾向O(1)
时间复杂度,乘数3的使用遵循相同的逻辑,它有它的优点,重新分配的频率较低它可能花费更少的时间,但它的缺点是更有可能有更多未使用的 space.
遵循此规则,任何乘数都可以说是有效的,这取决于更重要的因素,时间或 space 复杂性,也有可能根据向量的大小更改值,这这是有道理的,较小的向量可以有更大的乘数,但随着它们的增长,更合理地分配 space 更频繁,因为不会有太多 浪费 内存。
策略可以有很大的不同,从固定的 multipilers 到根据容器的当前大小进行更改,例如,see this answer, and tests @JHBonarius 友情分享。
In addition, how is the memory/time efficiency of std::vector compared to built-in static and dynamic arrays? Why would the book suggest always using std::vector even in a simple scenario which a simple static array could handle?
有争议的是你应该总是使用std::vector
如果你有一个你知道总是有相同大小的数组,那么使用[=14是完全没问题的=],但是,如果您为它保留 space 并且不在其中存储比保留大小更多的元素,std::vector
的行为可能与 std::array
类似,因此我可以从趋势上看到逻辑使用 std::vector
,虽然我不同意 always 部分,但它太明确了。
使用向量是最简单、最可靠的数据存储方式之一。使用数组时,必须在编译时定义大小。数组大小也是固定的,您无法在需要时更改它。使用动态数组(指针)总是有风险的。内存分配、释放等。如果您在某处使用指针,您的眼睛应该始终关注它。
我正在看《C++ Primer》,在关于容器的章节中,书上建议尽可能使用std::vector
,例如当不需要在中间或前面插入或删除时。
我用std::vector
测试了一下,发现每次需要重新分配时,它总是重新分配一块比以前大三倍的内存。不知道是不是总是这样,为什么会这样执行。
此外,std::vector
的memory/time效率与内置的静态和动态数组相比如何?为什么这本书建议总是使用 std::vector
,即使在一个简单的静态数组可以处理的简单场景中也是如此?
why would it execute in such a way
因为尽管这会浪费一些内存,但它通过减少重新分配的次数使插入速度更快。
它将 push_back
的复杂度保持在分摊的 O(1) 下,同时将大小增加 1 并每次重新分配将使它成为 O(n)。
reallocates a piece of memory that is three times larger than its previous size. I wonder if this is always the case
标准只是说 push_back
必须分摊 O(1) 复杂度,编译器(更准确地说,标准库实现)可以通过任何方式自由实现。
这不允许每次将容量增加 1,因为这会使复杂度为 O(n)。显然 achieving amortized O(1) requires the size to be increased by N times, but N can have any value. As show
memory/time efficiency of std::vector compared to built-in static and dynamic arrays?
访问速度应该差不多。插入和移除速度无法比较,因为数组具有固定大小。向量可能会使用更多内存,因为正如您所注意到的,它们可以为它们实际拥有的更多元素分配内存。
Why would the book suggest always using std::vector even in a simple scenario which a simple static array could handle?
不需要用向量替换固定大小的数组,只要静态数组足够小以适合堆栈即可。
应使用std::vector
而不是使用 new
手动分配数组,以减少内存泄漏和其他错误的风险。
I tested a bit with std::vector and noticed that every time it needs to reallocate, it always reallocates a piece of memory that is three times larger than its previous size. I wonder if this is always the case, and why would it execute in such a way.
就上下文而言,调整已填充可调整大小容器大小的可能重新分配策略是将其大小加倍,以免完全失去 O(1)
插入时间复杂度,因为重新分配时间复杂度为 O(N)
。
重新分配次数的对数特性使得这个插入操作不会失去它的倾向O(1)
时间复杂度,乘数3的使用遵循相同的逻辑,它有它的优点,重新分配的频率较低它可能花费更少的时间,但它的缺点是更有可能有更多未使用的 space.
遵循此规则,任何乘数都可以说是有效的,这取决于更重要的因素,时间或 space 复杂性,也有可能根据向量的大小更改值,这这是有道理的,较小的向量可以有更大的乘数,但随着它们的增长,更合理地分配 space 更频繁,因为不会有太多 浪费 内存。
策略可以有很大的不同,从固定的 multipilers 到根据容器的当前大小进行更改,例如,see this answer, and tests @JHBonarius 友情分享。
In addition, how is the memory/time efficiency of std::vector compared to built-in static and dynamic arrays? Why would the book suggest always using std::vector even in a simple scenario which a simple static array could handle?
有争议的是你应该总是使用std::vector
如果你有一个你知道总是有相同大小的数组,那么使用[=14是完全没问题的=],但是,如果您为它保留 space 并且不在其中存储比保留大小更多的元素,std::vector
的行为可能与 std::array
类似,因此我可以从趋势上看到逻辑使用 std::vector
,虽然我不同意 always 部分,但它太明确了。
使用向量是最简单、最可靠的数据存储方式之一。使用数组时,必须在编译时定义大小。数组大小也是固定的,您无法在需要时更改它。使用动态数组(指针)总是有风险的。内存分配、释放等。如果您在某处使用指针,您的眼睛应该始终关注它。