【发布时间】:2011-03-05 21:35:23
【问题描述】:
std::vector 是否总是将顺序内存地址中的数据包含为 array[number]?
【问题讨论】:
std::vector 是否总是将顺序内存地址中的数据包含为 array[number]?
【问题讨论】:
当您使用标准分配器时,您可以确保在使用 std::vector 时分配的内存是连续的。换句话说,foo[n+1] 是序列中 foo[n] 之后的下一个元素。但是 std::vector 不是一个数组,就像
int* blah = new int[100];
不是数组。但是
int blah[100];
在栈上做的是一个数组。 指向已分配内存和数组的指针恰好共享语义。根据标准,它们并不相等,所以不要混淆两者。
【讨论】:
new int[100] 确实创建了一个数组。 “由 new 表达式创建的实体具有动态存储持续时间......如果 [实体] 是一个数组,则 new 表达式返回一个指向数组初始元素的指针”(C++03 §5.3.4/1 )。 blah不是数组,而是new int[100]创建的对象。
是的,向量使用顺序内存来存储所有元素。这意味着随机访问几乎与普通数组的索引一样快。
但是向量在堆而不是堆栈中分配它的内存。所以在某些情况下它的效率可能会降低。
【讨论】:
对于除 bool 以外的所有类型,标准要求元素在内存中是连续的:
23.2.4/1 ... 向量的元素是连续存储的,这意味着如果 v 是一个向量,其中 T 是 bool 以外的某种类型,那么它遵循恒等式 &v[n] == &v[0 ] + n 代表所有 0
请记住,std::vector<bool> 有特殊要求,与 bool 数组不同。
【讨论】:
是的。给定:
std::vector<int> arr;
你可以确定
&arr[0]
将为您提供一个指向连续整数数组的指针,这些整数可以(例如)传递给旧版 API。
【讨论】:
是的。但是,它不会在堆栈上分配。
【讨论】:
allocate 方法持续存在。