繁体   English   中英

有关通过引用返回值的C ++难题

[英]c++ puzzle about return value by reference

set<string> foo {
  set<string> a;
  // operation on a
  return a;
}

如果执行以下操作,是否有任何性能差异:

set<string>& foo {
  set<string> a;
  // ops on a
  return a;
}

如果是这样,我的理解是a将在堆栈上分配。 foo()返回后,将回收内存空间。 我们如何引用已声明的内存?

在情况B中,对返回值的任何实际使用都会导致未定义的行为。 不允许您通过引用返回本地自动变量,并且希望任何人都可以访问它。

请参阅此实时工作空间警告消息。 当您执行类似的操作时,编译器通常会警告您,但并不总是建议您依赖它。

请注意,在C ++ 11中,第一个示例非常高效。 基于Betweeen左值引用的move和NRVO,按值返回本地std::vector<std::string>的开销大约为ifs并复制32位内存,或者在某些情况下更少(例如,实际上是零成本,因为std::set是直接在调用者范围内构造的)。

没有必要讨论不正确的代码的性能,例如第二个片段,该行为是未定义的(这通常会使程序崩溃)。 您不能返回对函数本地的自动对象(在堆栈上分配)的引用。

例如,如果您的foo函数是类的成员函数,并且正在返回对该类成员的引用,那是可以的:

class C {
public:
  set<string>& foo1 { return a_; }
  set<string> foo2 { return a_; }
private:
  set<string> a_;
}

在上面的示例中, foo1foo2更有效,因为它不会创建任何新对象,只需返回对现有对象的引用即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM