有什么区别
std::vector<uint8_t> vec1(size);
和
std::vector<uint8_t> vec2;
vec2.reserve(size);
它们都在堆上分配内存吗?
有什么区别?
不同之处在于,第一种方法在构造函数中设置了
vec1
的容量,这意味着它可以用size
类型的uint8_t
元素填充,而无需重新分配。然而,如果vec2
大于size
,vec2.capacity()
需要重新分配内存,这意味着它需要调用allocate()
的成员函数std::allocator<uint8_t>
两次。如需了解更多信息,请查看文档。
它们都在堆上分配内存吗?
一般来说,
allocate()
确实从堆中称为“内存池”的东西分配内存。但这并不是唯一的选择。我们可以将任何符合要求的实现称为分配器,但我们没有指定它是如何工作的。可以在here找到类似的答案。
在这里我想提供一个简单且不完整的示例来说明这一点:
template <typename T>
class my_allocator {
private:
// max size for allocation
static constexpr size_type MAX_SIZE = 64;
// data
int8_t _data[MAX_SIZE];
};
这样的话,只要我们实现了标准要求的所有接口,就可以从栈中的数组中分配内存了。