c++ 关于按引用返回值的谜题

标签 c++ 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 中,对返回值的任何实际使用都会导致未定义的行为。您不得通过引用返回局部自动变量并期望任何人都能够访问它。

查看此 live work space警告信息。当您执行此类操作时,您的编译器通常会警告您,但并不总是建议依赖它。

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

关于c++ 关于按引用返回值的谜题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16025606/

相关文章:

C++ 如何将百万个对象存储到数组中而没有段错误

c++ - 如何将 qrc 数据包含到使用 CMake 编译的基于 Qt 的二进制文件中

c++ - std::pair 将 first 和 second 分配给语义命名的变量

c++ - 使用多态基类(包含虚函数)访问时数组元素的类型

c++ - 对 unsigned int 中转换的 int 的 const 引用

c++ - 如何按值将不可复制的可移动对象作为 const 返回并存储它?

c++ - C++ STL::MAP 内部节点中存储了什么?

python - 如何通过opencv生成RGB直方图

reference - 在 Latex 中引用图形

c++ - 在 C++ 中使用引用变量的 void 返回类型