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/