有没有一个简单的移动结构的例子不会被忽略?
Is there a simple example of move construction that won't get elided?
我正在努力学习移动语义,以便将其介绍给我的学生。我一直在使用高度简化的类似向量或字符串的类,这些类管理内存,其成员输出消息来演示他们的活动。我正在努力开发一组简单的例子给学生看。
在gcc 4.7和clang中,RVO和其他地方的构造省略积极地消除了复制和移动构造,所以虽然我可以很容易地在工作中看到移动分配,但我在工作中唯一一次看到移动构造是如果我使用-fno elide构造函数关闭gcc 4.7中的构造省略。
显式复制构造语句
MyString newString(oldString);
将调用复制构造函数,即使启用了省略。但类似的东西
MyString newString(oldString1 + oldString2);
由于省略,没有调用move构造函数。
任何明确使用std::move的东西都不会成为一个简单的例子,因为解释std::move必须在后面。
所以我的问题是:有没有一个简单的代码示例可以调用move构造,即使复制/移动构造函数被省略了?
简单的例子是返回的函数的参数。标准明确禁止在这种情况下删除移动(并不是说他们可以…):
std::vector<int> multiply( std::vector<int> input, int value ) {
for (auto& i : input )
i *= value;
return input;
}
此外,您可以明确地请求移动构建一个更简单但更人为的示例:
T a;
T b( std::move(a) );
嗯。。。还有一个不涉及std::move
(从技术上讲,它可以被忽略,但大多数编译器可能不会):
std::vector<int> create( bool large ) {
std::vector<int> v1 = f();
std::vector<int> v2 = v1; // modify both v1 and v2 somehow
v2.resize( v2.size()/2 );
if ( large ) {
return v1;
} else {
return v2;
}
}
而优化器可以通过将代码重写为:来消除它
std::vector<int> create( bool large ) {
if ( large ) {
std::vector<int> v1 = f();
std::vector<int> v2 = v1; // modify both v1 and v2 somehow
v2.resize( v2.size()/2 );
return v1;
} else {
std::vector<int> v1 = f();
std::vector<int> v2 = v1; // modify both v1 and v2 somehow
v2.resize( v2.size()/2 );
return v2;
}
}
我非常怀疑编译器是否真的会这么做。请注意,在创建v1
和v2
之前,在每个代码路径中返回的对象都是已知的,因此优化器可以在重写后在返回位置找到合适的对象。
12.8/31中描述了可以取消复制/移动的情况。如果您设法编写了不属于这些类别的代码,并且该类型具有移动构造函数,则将调用移动构造函数。
嗯,让我们看看:
-
MyString newString(oldString)
是的副本。这里没有什么可忽略的;我们最终得到了两个对象。 -
MyString newString(oldString1 + oldString2);
从临时中复制,因此可以消除该副本,并直接就地构建连接。
这里有一个非常便宜的不可撤销移动结构的例子:
MyString boo()
{
MyString s("Hello");
return std::move(s); // move-construction from the local "s", never elided
}
显式强制转换使s
不符合RVO,因此返回值将从s
移动构造。
- 在c++中用vector填充一个简单的动态数组
- 有一个打印语句的函数是一种糟糕的编程实践吗
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 对于 ~95% 写入/5% 读取线程安全的无序列图,有没有一个简单的解决方案?
- 为什么一个简单的C++程序会有错误的结果?是 #define 引起的吗?
- C++中是否有一个功能可以创建一个像Python的"numpy.bmat"一样简单的块矩阵?
- 我在C 中写了一个简单的继承程序,但是我有很多错误
- 是否有一个演示 C/C++ OpenCV 程序,可以从网络摄像头进行简单的球跟踪
- 有没有一个简单的移动结构的例子不会被忽略?
- 是否有一个简单的 C 或 C++ 库用于将 FLAC 转码为 MP3
- 一个简单的PNG包装器.任何人都有可以分享的片段
- 用C++制作一个简单的3D图形引擎有多难
- 是否有一个简单的方法来实现AutoResetEvent在c++ 0x
- 有一个简单的程序文件/程序文件(x86)指令的c++在windows
- 简单的WinAPI应用程序有一个额外的控制台窗口
- 有一个简单的方法,使fastcgi应用程序
- 有没有一种简单的方法来初始化一个简单的类而不需要构造函数
- 是否有一个简单的GStreamer c++示例
- 单元测试-我试图用googlemock模拟一个简单的c++方法有什么问题?