移动普通指针是否存在优势?C++代码中std::move作用疑问
结论
在你给出的纯原生指针操作场景下,这里的std::move没有任何实际作用,和直接写perm_ptr = temp_ptr的效果完全一致,不存在任何性能或者语义上的优势。
具体原因
std::move的本质只是类型转换:它会将输入的左值转换为右值引用类型,但本身不会执行任何资源移动、所有权转移的逻辑,真正的移动行为是由对应类型的移动赋值运算符实现的。- 原生指针属于标量类型,没有自定义的赋值运算符,不管是左值指针还是右值指针赋值,都只是单纯拷贝内存地址值,不会触发任何额外操作。你给出的代码中
temp_ptr本身还是const修饰的指针,std::move转换后也不会改变其const属性,赋值行为和直接拷贝没有任何差异,编译后生成的汇编指令完全相同。
代码出现多余std::move的常见原因
这段代码大概率是历史遗留问题:
- 最初的实现中
perm_ptr和obj->get_ptr()的返回值可能是智能指针类型(比如std::unique_ptr),这种场景下std::move是必须的,用来转移智能指针的所有权。后续重构将智能指针替换为原生指针时,开发者没有删除多余的std::move调用,就遗留了这段无效代码。 - 也有可能是编写代码的开发者对
std::move的语义理解存在误区,误以为只要使用std::move就能优化赋值操作,忽略了操作对象是原生指针的场景。
内容的提问来源于stack exchange,提问作者user5965026
相关产品推荐
相关产品推荐

