夏至-微风 2025-06-18 我终于搞清楚了。std::move,实际上不会“移动”任何东西,它只是把变量强制转换为右值引用,以便于触发 T(T &&other) 移动构造函数的触发器而已。 比如一个vector,里面管理了一个动态内存分配出来的裸指针,如果对它使用 move ,那么就要看 vector 的移动构造函数怎么实现。 一般来说,如果使用 vector v2 = v1,意思是深拷贝,触发复制构造函数,这个函数的实现一般是重新分配空间,然后把v1的数据原封不动复制到v2中。 如果使用 vector v2 = std::move(v1),那么就会触发移动构造函数,由于这里我们是想让v1把资源让给v2,那么就可以直接在移动构造函数内部写 this->data = v1.data; v1.data = nullptr; 这样就完成了资源的“转移”,所谓“移动”就体现在这里。 ♥ 50 ↩ 7
toraoh 2025-06-07 其实用std::move后经常爆炸的情况是,忘了某个变量被std::move过了,然后继续从里面读数据,可是原来的变量早就invalid了,再用就炸。 ♥ 21 ↩ 3
夏至-微风 2025-06-08 我一直以为这个函数作用是这样的: 一份资源属于变量A,现在我调用move,B=move(A),那么这份内存上的资源现在就属于B,不能再通过A继续访问这份资源,期间没有经过任何资源的复制、移动操作。打个比方的话就是,A是变量,B是A的引用,move一下,B转正成变量,A变成空引用(实际上没有空引用) 现在看来是我多虑了 ♥ 5 ↩ 5
Comments
感觉被知识强碱了[笑哭]
♥ 71 ↩ 1
虽然视频很有趣,但是怎么说呢?懂得人才能看懂是不是不太好[吃瓜][笑哭]
♥ 69 ↩ 5
我终于搞清楚了。std::move,实际上不会“移动”任何东西,它只是把变量强制转换为右值引用,以便于触发 T(T &&other) 移动构造函数的触发器而已。 比如一个vector,里面管理了一个动态内存分配出来的裸指针,如果对它使用 move ,那么就要看 vector 的移动构造函数怎么实现。 一般来说,如果使用 vector v2 = v1,意思是深拷贝,触发复制构造函数,这个函数的实现一般是重新分配空间,然后把v1的数据原封不动复制到v2中。 如果使用 vector v2 = std::move(v1),那么就会触发移动构造函数,由于这里我们是想让v1把资源让给v2,那么就可以直接在移动构造函数内部写 this->data = v1.data; v1.data = nullptr; 这样就完成了资源的“转移”,所谓“移动”就体现在这里。
♥ 50 ↩ 7
写C++写的看不到未来.jpg
♥ 48 ↩ 2
最搞笑的是牛客上一个大佬说要放弃腾讯的offer,底下有人说用std::move把这个offer给他
♥ 24 ↩ 1
rust:这不是被动技能吗[doge]
♥ 21 ↩ 1
其实用std::move后经常爆炸的情况是,忘了某个变量被std::move过了,然后继续从里面读数据,可是原来的变量早就invalid了,再用就炸。
♥ 21 ↩ 3
这个赛道真的太新奇了[doge]
♥ 17 ↩ 1
?第一次看见讲cpp讲这么搞的[笑哭]
♥ 11 ↩ 1
神金啊
♥ 11 ↩ 1
小时候写C++特别在意什么零开销抽象,长大工作写了几年Kotlin后整个大脑皮层变得无比光滑()
♥ 10 ↩ 9
以为是Rust()
♥ 9 ↩ 2
感觉知识拉到了我的脑子里
♥ 9 ↩ 1
这个系列请一直做下去[doge]
♥ 6 ↩ 1
为什么刚在mpi相关的地方写完std::move就刷到了这个视频[思考]
♥ 6 ↩ 1
好有趣[打call]
♥ 6 ↩ 1
怎么会有这么有意思的up主?你是我在b站见过最有意怎么会有这么有意思的up主
♥ 5 ↩ 3
有种被知识强奸的感觉[热]
♥ 5
我一直以为这个函数作用是这样的: 一份资源属于变量A,现在我调用move,B=move(A),那么这份内存上的资源现在就属于B,不能再通过A继续访问这份资源,期间没有经过任何资源的复制、移动操作。打个比方的话就是,A是变量,B是A的引用,move一下,B转正成变量,A变成空引用(实际上没有空引用) 现在看来是我多虑了
♥ 5 ↩ 5