默认情况下,返回是否使用移动或复制语义
Does return use move or copy semantics by default?
从C#移动到C++,试图了解幕后发生的事情。
鉴于:
int ReturnSomething(){
int i = 1;
return i;
}
在 C++17 中,移动是否优先于副本?如果是这样,相同的规则是否适用于显式定义移动构造函数的用户定义类型?
默认情况下,返回是否使用移动或复制语义?
取决于。
在 C++17 中,移动是否优先于复制?
确切的规则有点复杂,但一般来说,如果可以移动,那么它比复制更可取。
在某些情况下,甚至没有移动。例如:
T ReturnSomething(){
return 1;
}
T t = ReturnSomething();
不涉及复制。为t
变量分配一个对象,ReturnSomething
直接初始化该对象。不涉及临时对象。
当然,当类型像int
一样微不足道地可移动/可复制时,没有可观察到的区别。即使有副本,也可以对其进行优化。复制和移动整数之间没有区别。
相关文章:
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 使lambda不可复制/不可移动
- 复制和交换习惯用法与移动操作之间的交互
- 为什么调用复制构造函数而不是移动构造函数?
- 隐式移动与复制操作和遏制
- 具有已删除移动和复制构造函数的类的就地构造
- 使用移动和复制语义时函数匹配如何工作?
- 直接初始化不可复制、不可移动的成员,而不使用聚合初始化
- 包装二进制缓冲区 - 可能没有多余的移动/复制?
- 当使用三元运算符并删除移动/复制CTOR时,Visual Studio不执行RVO
- 我们是否应该从派生类调用基类移动复制/分配构造函数
- 具有unique_ptr成员变量的 C++ 移动/复制/赋值<AbstractClass>
- 返回带有已删除移动/复制 ctor 的类型临时
- 消除默认/删除移动/复制语义中涉及的样板的好方法是什么
- C++11:移动/复制构造不明确
- 关于移动/复制c++对象实例
- 我丢失了一个移动/复制赋值
- 如何创建一个不可移动/复制构造的对象数组
- 编译器何时在C++中移动/复制