将本地 std::vector 分配给 C++ 中的引用
Posted
技术标签:
【中文标题】将本地 std::vector 分配给 C++ 中的引用【英文标题】:Assigning local std::vector to reference in C++ 【发布时间】:2017-04-07 04:34:44 【问题描述】:我不确定我的方法是否正确。
因为我通过引用Function
传递向量v
,所以在它的执行之后向量的内容会改变。
如果我不能直接处理向量 v
并决定使用临时向量 temp
怎么办。通过v = temp
分配给v
我的临时地址是否正确?不会引用v
指向在执行Function
后将被清除的内存?
void Function(std::vector<bool> &v)
std::vector<bool> temp(v.size(), false);
// some operations on vector temp
// ...
v = temp;
【问题讨论】:
【参考方案1】:不会引用
v
指向在执行Function
后将被清除的内存吗?
没有。对于v = temp;
,v
是从temp
分配的副本。那么v
将包含与temp
相同的内容,但与temp
无关; temp
是本地对象,稍后会被销毁,但传入的参数不受影响。
顺便说一句:由于temp
是一个本地对象,在退出函数时将被销毁,因此从中复制可能效率低下。你可以离开它:
v = std::move(temp);
【讨论】:
编译器优化不会自动生成移动而不是复制,因为 temp 直接超出范围? @A.S.H 可能,也可能不会。标准没有提到这种优化,它不能保证,也不能移植。所以还是自己动手做比较靠谱。 如果我在Function
结束后尝试使用v
,它不应该是不安全的,因为v
指向temp
和temp
不再存在。它会是任何如果使用指针而不是引用,则不同。
@GauravSehgal 否。指针与引用不同。分配引用时,您分配的是引用指向的变量的值,而不是引用本身。另一方面,您不能重新绑定对其他变量的引用。例如int i = 0; int j = 1; int& r = i; r = j; j = 2;
那么r
和i
的值都是1
,但是r
仍然绑定到i
,而不是j
。
@songyuanyao 知道了。非常感谢。【参考方案2】:
是的,分配 v = temp 是安全的。有关更多信息,请查看例如:https://isocpp.org/wiki/faq/references#overview-refs
【讨论】:
以上是关于将本地 std::vector 分配给 C++ 中的引用的主要内容,如果未能解决你的问题,请参考以下文章
将 std::vector 分配给 std::valarray
C++ STD 容器:std::vector - 有没有办法清除向量并保留存储分配?