C ++引用vs局部变量

时间:2013-07-29 17:01:36

标签: c++ memory reference

假设我有一些对象,例如:

std::map<int, std::vector<double> > some_map;

简单问题:执行以下操作是否更有效

std::vector<double> vec = some_map[some_index];

或引用它

std::vector<double>& vec = some_map[some_index];

任何人都可以简单解释一下幕后通常会发生什么?

非常感谢!

3 个答案:

答案 0 :(得分:7)

这两者具有不同的语义,并且不可互换。 第一个给你一个副本,你可以修改它 希望,不改变地图中的任何内容。第二个给出 你引用了地图中的数据元素;任何 修改修改地图的内容。而且,虽然 可能不是问题,请注意,如果地图被破坏了 在引用超出范围之前,引用将 吊着。

关于性能,它取决于向量中的内容, 以及你以后用它做什么在大多数情况下,参考将 可能有更好的表现,但你不应该担心 直到分析师说你必须这样做。 (如果你确实使用了 参考,使它const,除非你真的想要能够 修改地图的内容。)

答案 1 :(得分:4)

创建引用更有效,但是您应该注意这两个语句在语义上是不同的,并且具有不同的行为。

如果你这样做

std::vector<double> vec = some_map[some_index];

调用std::vector的复制构造函数将整个向量some_map[some_index]复制到vec。通过这种方式,您将获得一个全新的向量vec。它们是独立的对象,对vec的任何更改都不会影响原始地图。

如果您使用

std::vector<double>& vec = some_map[some_index];

然后vec直接引用some_map[some_index]并避免复制。但请注意,如果您稍后更改vec,则更改将反映在vecsome_map[some_index]中,因为它们引用同一个对象。为了防止不必要的更改,使用const引用更安全:

const std::vector<double>& vec = some_map[some_index];

答案 2 :(得分:1)

在使用的内存和cpu周期方面,引用效率更高。您的第一行代码生成了向量的副本,其中包括复制向量中的每个项目。在第二个中,您只是指现有的向量。没有制作副本。