美文网首页
c++中move的一点细节

c++中move的一点细节

作者: 安安爸Chris | 来源:发表于2018-04-28 15:50 被阅读0次

细节1: 内存分配在栈的变量会被转移托管

....
{
string str = "i will be free if out of scope";
}
....

栈变量在出了作用域后系统会自动释放栈上内存,但是如果将它move给了其他人,会怎么样呢?

string other;
    {
    string str = "i'm transferred...";
    cout<<"str addr:"<<&str<<endl;
    other = move(str);
    cout<<"other addr:"<<&other<<endl;
    }
cout<<other<<endl;

正常来说str对应的内存出了作用域后就应该释放了。但是实际上还是存在的。move操作将管理权一并交出。运行结果如下:


1.PNG

从运行结果来看,这两个string对应的是两个不同的地址。两个地址是独立的,move操作实际上是系统将这一块地址属于哪一个地址的登记改一下,实际上这一块内存根本没有发生任何变化。
打个比方,就好比说一个房产,原来登记在张三名下,“张三”就是地址。张三也有管理权。move就相当于过户。过户给李四后,“李四”就是这个房子的“地址”,管理权自然也交接给了李四。

那如果是堆上分配的内存呢?

string other;
    {
    string* str = new string("i'm transferred...");

    other = move(*str);
    delete str; // it's ok
    }
cout<<other<<endl;

其实一样的。这里的delete是没有实际作用的。

细节2:指针可以move

继上面的例子,被转移的对象都是实例对象,如果是指针可不可以呢?

string *other;
    {
    string str("i'm transferred...");

    *other = move(str); // not ok 
    }
    cout<<*other<<endl;

有些时候需要move的对象比较复杂,处理化可能比较麻烦。想找个方便的方法,用一个指针去move。但是这样是不可以的。被move的对象必须实例化,不可以拿一个指针去接受move。

那指针就不能用于move吗?

标题我都写的,是可以的,但是不可以按上面的例子写。需要这样改一下

    string *other;
    {
    string* str = new string("i'm transferred...");
    cout<<"str:"<<str<<endl;
    other = move(str);
    cout<<"other:"<<other<<endl;
    //delete str;  // not ok
    }
    cout<<*other<<endl;

可以将指针move给另一个指针,所以这样用是可以的。
也可以发现,使用move的结果是使两个指针一致。
所以跟直接用=号的行为一样。那么为啥不干脆直接用=呢?

2.PNG

相关文章

  • c++中move的一点细节

    细节1: 内存分配在栈的变量会被转移托管 栈变量在出了作用域后系统会自动释放栈上内存,但是如果将它move给了其他...

  • C++ 中 move 语义的理解

    std::move 是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。 如...

  • C++标准库读书笔记: Utilities

    参考书目:[The C++ Standard Library 2nd Edition] Move Semantic...

  • C++ Move Semantics

    Rvalue references and std::move[https://r859981c931022xju...

  • C++ move构造函数和move赋值

    看一下下面这个例子 输出: 好多构造函数和析构函数执行,下面分析一下每个打印代表的步骤1)nside genera...

  • 左值右值引用和移动构造

    左值与右值 左值引用右值引用 C++ 11中用&表示左值引用,用&&表示右值引用 (move函数可以把一个) 进...

  • C++11之move语义

    要理解c++11的move语义,就需要理解C++中的左值和右值和临时对象的概念。 左值与右值和临时对象的简单介绍:...

  • 美文|走出失恋的阴霾

    收起你的眼泪,继续前行! (Stop crying and move on!) 停止回忆过往细节,专心致志地活在当...

  • Java与C++关于构造函数的差异

    case1 Java: C++: C++输出为: Java输出为: 这个例子体现了C++在Java的细节差异: J...

  • C++中为什么move construct需要加noexcept

    C++ 11中增加了名为移动构造函数的构造函数类型。通过使用移动构造函数,我们可以在进行对象复制时直接“窃取”拷贝...

网友评论

      本文标题:c++中move的一点细节

      本文链接:https://www.haomeiwen.com/subject/jopglftx.html