std::move使用实例

std::move使用实例

#include  
#include class TestPtr : public std::enable_shared_from_this<TestPtr>
{
public:TestPtr(std::string  str = "000") {std::cout << "TestPtr construct:" <<this << std::endl; strName = str;}~TestPtr(){std::cout << "TestPtr desconstruct:"<< strName <<" this:" << this << std::endl;}std::shared_ptr<TestPtr> get(TestPtr * ptr){std::shared_ptr<TestPtr> curPtr(ptr);std::cout << "    inner curPtr:" << curPtr << std::endl;std::cout << "    inner ptr:" << ptr << std::endl;std::cout << "    inner ptr strName:" << ptr->strName << std::endl;std::cout << "    inner curPtr use_cout:" << curPtr.use_count() << std::endl;return curPtr;}std::shared_ptr<TestPtr> getPtr (){return shared_from_this();}//移动构造函数TestPtr(TestPtr && test):strName(std::move(test.strName)){std::cout << "move operator () " << std::endl;}//移动赋值函数TestPtr& operator = (TestPtr && test){std::cout << "move operator = " << std::endl;strName = std::move(test.strName);}void print(){std::cout << "print this:" << this << std::endl;}void getstr() {std::cout << "str:" << strName <<std::endl;}
public:std::string strName;
};int main()
{std::shared_ptr<TestPtr> testPtr;std::cout << "---------------------ptr-----------------------------\r\n" << std::endl;{TestPtr * ptr = new TestPtr(std::string("123"));std::cout << "ptr:" << ptr << std::endl;testPtr = testPtr->get(std::move(ptr));std::cout << "move end, ptr:" << ptr << "  strName:" << ptr->strName << std::endl;std::cout << "testPtr use_count:" << testPtr.use_count() << std::endl;}std::cout << "\r\n-----------------------move-prt---------------------------\r\n" << std::endl;//std::move() testPtr->print();std::shared_ptr<TestPtr> testPtr1;testPtr1 = std::move(testPtr);testPtr->print();testPtr1->print();std::cout << "move use_cout:" << testPtr1.use_count() << std::endl;std::cout << "\r\n-----------------------shared__from_this----------------------------\r\n" << std::endl;//shared_from_this()std::shared_ptr<TestPtr> testPtr3;testPtr3 = testPtr1->getPtr();std::cout << "shared_from_this use_cout:" << testPtr1.use_count() << "    test3:" << testPtr3 << std::endl;//赋值std::shared_ptr<TestPtr> testPtr4;testPtr4 = testPtr3;std::cout << "=                use_cout:" << testPtr1.use_count() << "    test4:" << testPtr4<< std::endl;std::cout << "\r\n------------------------move-struct------------------------------\r\n" << std::endl;TestPtr stru1(std::string("223"));std::cout << "    stru1:" << &stru1 << "  strName :" << stru1.strName  << std::endl;auto stru2  = std::move(stru1);std::cout << "    stru1:" << &stru1 << "  strName :" << stru1.strName  << std::endl;std::cout << "    stru2:" << &stru2 << "  strName :" << stru2.strName  << std::endl;TestPtr stru3;std::cout << "    stru3:" << &stru3 << "  strName :" << stru3.strName  << std::endl;stru3  = std::move(stru2);std::cout << "    stru2:" << &stru2 << "  strName :" << stru2.strName  << std::endl;std::cout << "    stru3:" << &stru3 << "  strName :" << stru3.strName  << std::endl;stru1.print();std::cout << "\r\n------------------------------------------------------\r\n" << std::endl;return 0;}

执行结果:

---------------------ptr-----------------------------TestPtr construct:0x2295040
ptr:0x2295040inner curPtr:0x2295040inner ptr:0x2295040inner ptr strName:123inner curPtr use_cout:1
move end, ptr:0x2295040  strName:123
testPtr use_count:1-----------------------move-prt---------------------------print this:0x2295040
print this:0
print this:0x2295040
move use_cout:1-----------------------shared__from_this----------------------------shared_from_this use_cout:2    test3:0x2295040
=                use_cout:3    test4:0x2295040------------------------move-struct------------------------------TestPtr construct:0x7fffaf782990stru1:0x7fffaf782990  strName :223
move operator ()stru1:0x7fffaf782990  strName :stru2:0x7fffaf7829b0  strName :223
TestPtr construct:0x7fffaf7829d0stru3:0x7fffaf7829d0  strName :000
move operator =stru2:0x7fffaf7829b0  strName :000stru3:0x7fffaf7829d0  strName :223
print this:0x7fffaf782990------------------------------------------------------TestPtr desconstruct:223 this:0x7fffaf7829d0
TestPtr desconstruct:000 this:0x7fffaf7829b0
TestPtr desconstruct: this:0x7fffaf782990
TestPtr desconstruct:123 this:0x2295040

总结:使用std::move的时候定义的类或者结构体要支持移动构造函数或者移动赋值函数,只有在支持的情况下,std::move才能起到减少拷贝的作用


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部