我正在尝试学习移动语义,以便向我的学生介绍。我一直在使用高度简化的类似于向量或字符串的类来管理内存,并输出消息以展示它们的活动。我正在尝试开发一组简单的示例来向学生展示。
在gcc 4.7和clang中,用于RVO和其他地方的构造省略会积极消除复制和移动构造函数,因此,虽然我可以轻松看到移动赋值的工作原理,但我只有在关闭gcc 4.7中的构造省略(-fno-elide-constructors)时才能看到移动构造函数的工作原理。
一个显式的复制构造语句。
在gcc 4.7和clang中,用于RVO和其他地方的构造省略会积极消除复制和移动构造函数,因此,虽然我可以轻松看到移动赋值的工作原理,但我只有在关闭gcc 4.7中的构造省略(-fno-elide-constructors)时才能看到移动构造函数的工作原理。
一个显式的复制构造语句。
MyString newString(oldString);
即使启用了省略,它也会调用复制构造函数。但是像这样的代码:
MyString newString(oldString1 + oldString2);
由于省略,不会调用移动构造函数。
任何明确使用std::move的内容都不会形成简单示例,因为解释std::move必须在后面进行。
所以我的问题是:是否有一个简单的代码示例,即使复制/移动构造函数被省略,也会调用移动构造函数?
std::move
的情况下是否可以完成... - Mooing Duckstd :: move
是显式移动对象的方法。移动支持主要涉及显式移动,因为大多数隐式移动可以通过省略来捕获。通过将move
隐藏起来,您会对从中学习的任何人造成不利影响。 - Nicol BolasoldString1+oldString2
触发了一个复制(这里没有优化),但是该复制被移动到newString
中(优化)。实际上,这很难触发,因为编译器选择“复制省略”优化而不是“移动复制”优化(有充分的理由)。 - André Caron