gpt4 book ai didi

c++ - C++如何处理双重移动?

转载 作者:行者123 更新时间:2023-11-28 04:10:42 25 4
gpt4 key购买 nike

例如,如果我有一个函数:

struct my_type {
void add(some_type st) {
values_.emplace_back(
std::move(st)
);
}
vector<some_type> values_;
};

然后我给成员(member)打电话:

int main() {
my_type mt;
some_type st;
mt.add(std::move(st));
}

我已经将 st 移到 add 的参数中,他们只是将它转过来并将其移到它正在管理的容器中。

这经常出现在我对一些底层容器进行包装的地方。

C++ 语言是否允许/要求对这种“双重移动”模式进行一些优化?或者我应该编写单独的左值和右值添加函数吗?

最佳答案

移动是对右值引用的转换。

它的作用取决于您将它传递给哪个函数或构造函数。

在您的情况下,这取决于您从 some_type&& 构造实例时 some_type 的作用。

这实际上是您没有包含的任意代码。

如果 some_type 是用一个简单高效的移动构造函数编写的,并且它不会泄露其身份,那么就好像可以消除中间实例一样。另一方面,如果 some_type 泄漏身份或做其他类似和/或坏事,则中间对象可能必须实际存在。

例如,作为some_typestd::vector 可能会被删除;如果不是,您也不会在意,因为移动是复制并归零的 3 个指针。复制到 std err 时打印其地址的类型,可能不是。

目前没有任何类似于省略的东西可以在有副作用的情况下允许生命周期合并。沿着这个方向已经有一些提议,但我不知道有什么进展(这主要是我无知的证据,而不是不存在的证据),我怀疑他们是否涵盖了这种情况。

如果你不知道什么是省略,你应该去学习;在实际讨论这个问题之前,你需要新的词汇。在不了解 C++ 省略的情况下谈论 C++ 中的这个问题就像与一个不知道乘法是什么的人讨论 e^(ipi)+1=0 一样。可能,但啰嗦。

关于c++ - C++如何处理双重移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57847453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com