gpt4 book ai didi

c++ - 带有 move 语义的源函数和汇函数的签名

转载 作者:搜寻专家 更新时间:2023-10-31 01:51:17 24 4
gpt4 key购买 nike

在编写源函数和汇函数时,我应该使用哪些签名来从 move 语义中获益,为什么?

T source();
sink(T);

// or

T&& source();
sink(T&&);

最佳答案

嗯,T&& source() 考虑到源创建并返回一个新对象,这绝对是垃圾。不要从函数返回对局部变量的引用,此规则同样适用于右值引用,因为它始终适用于左值引用。

使用 sink(T&&) 是一种品味问题。它看起来不是那么干净和流线型,但另一方面,它更明确地强调了函数的接收器性质,并使 move 成为强制性的,即使对于也可能被复制的类型也是如此。但是,如果 T 无论如何都应该是不可复制的类型(如 std::unique_ptr),我更喜欢 sink(T) ,因为它看起来更干净一点,并且 move 是由类型的不可复制性质明确说明的,无论如何。

但是无论如何您都会受益于 move 语义,这是它们的优势之一,它们可以很好地集成到现有代码中。所以 T t = source(); 会 move ,sink(std::move(t)); 也会 move ,无论哪个签名 sink 有。只是 sink(T) 不会阻止您使用 sink(t); 而不是 sink(std::move(t)) 来调用它; 对于可复制的类型,这反过来又不会使用 move 语义。但这是一个完全不同的问题,因为无论如何,只要适当就使用 std::move 应该是尽快学会的习语。

编辑: 的确,sink(T) 不能很好地处理效率不高的可 move 类型(使用基于值的实现的类型,即 std::array), 因为它需要一个拷贝,而 (rvalue) 引用可能会这样做。即使对于可 move 类型,根本不 move 仍然比 move 更快(尽管这应该可以忽略不计)。但话又说回来,我认为,sources 和 sinks 首先不能很好地与值实现类型一起使用。在这种情况下,T source() 无论如何在性能方面都不是一个好主意(但它也不能被如上所述的 T&& source() 代替) ).

关于c++ - 带有 move 语义的源函数和汇函数的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13987663/

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