如果您有一个已调整大小的 STL 向量,那么获取元素 0 的地址并假设该向量的其余部分将跟随在内存中是否安全?
例如
vector<char> vc(100);
// do some stuff with vc
vc.resize(200);
char* p = &vc[0];
// do stuff with *p
是的,这是一个有效的假设 (*)。
来自 C++03 标准(23.2.4.1):
向量的元素是连续存储的,这意味着如果 v 是一个向量,其中 T 是除 bool 之外的某种类型,那么对于所有 0 <= n < v,它都遵循恒等式 &v[n] == &v[0] + n 。尺寸()。
(*) ...但要注意在向其添加元素后重新分配的数组(使任何指针和迭代器无效)。
C++03 标准增加了措辞,明确向量元素必须是连续的。
C++03 23.2.4 第 1 段包含以下C++98 标准文档中没有的语言:
a 的元素
vector
是连续存储的,这意味着如果v
a 是 a 以外vector<T, Allocator>
的T
某种类型bool
,则它服从&v[n] == &v[0] + n
all的标识0 <= n < v.size()
。
Herb Sutter 在他的一篇博客文章中谈到了这一变化,不畏惧:向量保证是连续的:
...连续性实际上是矢量抽象的一部分。事实上,它是如此重要,以至于当发现 C++98 标准并没有完全保证连续性时,C++03 标准被修改为明确添加了保证。
存储始终是连续的,但它可能会随着向量容量的变化而移动。
如果在容量更改操作之前,您在元素零(或任何元素)上有指针、引用或迭代器,则它无效,必须重新分配。
std::vector
保证项目存储在连续数组中,因此是数组的首选替代品,也可用于与平台相关的低级代码(如 Win32 API 调用)进行交互。要获取指向数组的指针,请使用:
&myVector.front();
是的。
它应该始终是连续的