关于通过引用返回值的c ++难题

Wha*_*rld 4 c++ reference

set<string> foo {
  set<string> a;
  // operation on a
  return a;
}
Run Code Online (Sandbox Code Playgroud)

如果我这样做,是否有任何性能差异:

set<string>& foo {
  set<string> a;
  // ops on a
  return a;
}
Run Code Online (Sandbox Code Playgroud)

如果是这样,我的理解是将在堆栈上分配.foo()返回后,将回收内存空间.我们如何参考所声称的记忆?

Yak*_*ont 5

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

请参阅此实时工作空间警告消息.当你做这样的事情时,你的编译器通常会警告你,但并不总是建议依赖它.

请注意,在C++ 11中,第一个示例非常高效.在基于左值参考的移动和NRVO之后,std::vector<std::string>通过值返回本地的成本是几个ifs的顺序并且复制32位的存储器,或者在某些情况下更少(即,实际上是零成本,因为std::set在呼叫者范围直接).

  • 由于返回值优化,第一种情况基本上总是有效的,这得到了标准的明确认可. (2认同)