c ++引用是否像宏替换一样工作?

时间:2017-06-06 07:02:29

标签: c++ pointers vector reference

std::vector<int> v;
v.push_back(1);
int &r0=v[0],*p0=&v[0];
v.insert(v.begin(),0);
for (int i=2; i<1000000; i++) v.push_back(i);

在我插入并添加其他元素后,整个矢量可能会转移到不同的内存位置吗?

那么r0和p0会返回什么?

如果向量已经移位我猜测p0会指向垃圾但参考仍然有效(即返回0)?是一个类似于宏替换的引用?

1 个答案:

答案 0 :(得分:1)

引用与宏替换完全不同。

任何增加std::vector大小的操作都会使其end()迭代器无效。如果调整大小也会增加向量的容量(即重新分配底层内存),begin()迭代器也会失效。

这意味着r0p0都可能无效。如果没有在调整大小之前和之后检查并比较v.capacity()的结果(并确认容量没有变化),则无法保证r0p0引用或指向第一个元素向量v

用于更新向量大小和容量的策略是实现定义的。鉴于您的代码插入了一百万个元素(1000001),很可能在某个时刻容量增加,并且r0p0都无效(即(实际上,很少有std::vector的实现会使用一种策略,在添加这些元素时不需要调整大小。所以,实际上,r0p0都是无效的,这是公平的赌注。

向量的地址(即&v)不会改变。由vv.capacity()v.size()v.data()v.begin()v.end()等管理的数据的特征将会(可能)发生变化