提问人:f1msch 提问时间:3/27/2023 最后编辑:Some programmer dudef1msch 更新时间:3/27/2023 访问量:74
如何在结构化回报中保存额外的复制结构?
How to save additional copy construct in structured return?
问:
如果我想以结构化返回的方式返回一些结构。喜欢
pair<bool, vector<int>> get(const string &id) {
vector<int> v;
return {true, v};
}
或
struct st{};
pair<bool, st> get(const string &id) {
st v;
return {true, v};
}
并使用 like
auto [a1, b1] = get("1"); ---version1
auto &[a2, b2] = get("1"); ---version2
所以我有两个疑问,主要是考虑到复制结构的成本。
Q1: 在我的通话案例中和在内或外有区别吗?
Q2:在复制到返回的过程中总是需要一次复制结构,但我认为至少在我的情况下这是不必要的。那么有没有办法节省复制构建的这段时间呢?version1
version2
get
pair
答:
1赞
A M
3/27/2023
#1
您需要了解 (N)RVO(((命名)返回值优化)和复制省略。
两者在CPP标准中都有很好的描述。
在大多数情况下,您无需担心 expensiv 复制操作。编译器将使用 RVO 来帮助您。但是,在一些极端情况下,RVO 将不起作用。再次,请阅读它。
您可以想象,编译器在函数之外为返回值创建空间,因此在调用方帧/作用域中。那么很明显,没有发生复制。
在这方面,最好先创建返回值,然后再返回它。然后 RVO 就会发生。
在返回对函数局部变量的引用时,您可能会遇到麻烦。这可能会产生悬空引用。(对函数结束后超出范围的函数局部变量的引用)。如果你想使用它,那么你可以使用引用。const
因此,您可以同时使用两者
#include <utility>
#include <string>
#include <vector>
using namespace std::string_literals;
std::pair<bool, std::vector<int>> get1(const std::string &id) {
std::pair<bool, std::vector<int>> result{true, {}};
return result;
}
struct st{};
std::pair<bool, st> get2(const std::string& id) {
std::pair<bool, st> result{true, {}};
return result;
}
int main() {
const auto& [a1, b1] = get1("1"s);
auto [a2, b2] = get1("1"s);
const auto& [c1, d1] = get2("1"s);
auto [c2, d2] = get2("1"s);
return a1 and a2 and c1 and c2;
}
如果可能的话,建议使用该版本。const
在 Compiler Explorer 上查看输出
看看 Clang 做了什么 :-)
评论
move
return std::move({true, std::move(v)})
auto const&[a2, b2]
const