Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ move构造函数的实用性_C++_C++11_Move Semantics - Fatal编程技术网

C++ move构造函数的实用性

C++ move构造函数的实用性,c++,c++11,move-semantics,C++,C++11,Move Semantics,我在网上找到了这个例子 #包括 使用名称空间std; 类阵列振打器 { 公众: //默认构造函数生成大小适中的数组 阵列振打器() :_p_vals(新整数[64]) ,_尺寸(64) {} 阵列振打器(内部n) :_p_vals(新整数[n]) ,_尺寸(n) {} //移动构造函数 阵列振打器(阵列振打器和其他) :_p_vals(其他._p_vals) ,_尺寸(其他。_尺寸) { cout本例中不使用移动构造函数,因为a是一个左值。但是,如果您有一个函数返回ArrayRapper,即Ar

我在网上找到了这个例子

#包括
使用名称空间std;
类阵列振打器
{
公众:
//默认构造函数生成大小适中的数组
阵列振打器()
:_p_vals(新整数[64])
,_尺寸(64)
{}
阵列振打器(内部n)
:_p_vals(新整数[n])
,_尺寸(n)
{}
//移动构造函数
阵列振打器(阵列振打器和其他)
:_p_vals(其他._p_vals)
,_尺寸(其他。_尺寸)
{

cout本例中不使用移动构造函数,因为
a
是一个左值。但是,如果您有一个函数返回
ArrayRapper
,即
ArrayRapper func()
,则其函数调用的结果将是一个右值,因此在执行
ArrayRapper b(func())
时使用移动构造函数

这可能是一个良好的开端:

在这里,对函数的调用将创建一个临时数组rayRapper,该数组rayRapper的数据将在函数内部移动而不是复制,这意味着只设置一个指针,而不必将临时数组中的所有数据复制到函数内部参数中

以下是一个更常见的变体:

ArrayWrapper generate_random_data( int seed );

void do_something_complex( ArrayWrapper data );

int main()
{
   do_something_complex( generate_random_data( 42 ) );
}    
同样的情况也会发生:generate函数返回的数据在dosomething函数参数内被移动(使用move构造函数),而不是复制

进一步澄清:

ArrayWrapper generate_random_data( int seed )
{
    int random_count = random( 0, 42, seed ); // lets say this work
    return ArrayWrapper( seed );
}
这里可能发生两件事。首先,移动构造函数将用于在函数外部传递返回的对象,不需要使用指针或类似的东西(如果没有移动构造函数,将使用复制构造函数)。第二,如果您有:

ArrayWrapper a = generate_random_data( 42 );
然后,大多数编译器将生成一个名为NRVO的授权优化,基本上,返回的对象将在外部指定的对象(这里是“a”)中构造


这意味着,如果可以,编译器将同时避免移动和复制构造。如果不能同时避免移动和复制构造,则当确定对象不会超出移动范围时,它将尝试移动对象。如果不能确定,则将使用副本。

显然它不会调用移动构造函数。只有第二个构造函数。@iulian你说的是哪一部分?我说的NRVO优化在必要时会避免移动。如果你看到int构造函数调用但没有其他构造函数,那么它会避免移动和复制。好的,现在我明白了。我没有读过NRVO问题。谢谢。
ArrayWrapper generate_random_data( int seed )
{
    int random_count = random( 0, 42, seed ); // lets say this work
    return ArrayWrapper( seed );
}
ArrayWrapper a = generate_random_data( 42 );