首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C++中实现移动功能?

如何在C++中实现移动功能?
EN

Stack Overflow用户
提问于 2021-11-05 04:49:13
回答 1查看 233关注 0票数 1

我想知道C++中的move函数的内部结构。为此,我打算自己实现名为move2的move函数。

下面是我的实现,通过打印跟踪内存分配。

代码语言:javascript
复制
#include <iostream>
#include <vector>

using namespace std;
void * operator new(size_t size) {
    cout << "New operator overloading " << endl;
    void * p = malloc(size);
    return p;
}

void operator delete(void * p) {
    cout << "Delete operator overloading " << endl;
    free(p);
}

template<typename T>
T move2(T& input) {
    cout << "Running move2 " << endl;
    return (T&&)input;
}

int main()
{
    {
        cout<<"Test#1"<<endl;
        vector<int> temp1(10,4);
        vector<int> temp2 = temp1;
    }
    {
        cout<<"Test#2"<<endl;
        vector<int> temp3(10,4);
        vector<int> temp4 = (vector<int>&&)(temp3);
    }
    {
        cout<<"Test#3"<<endl;
        vector<int> temp5(10,4);
        vector<int> temp6 = move(temp5);
    }
    {
        cout<<"Test#4"<<endl;
        vector<int> temp7(10,4);
        vector<int> temp8 = move2(temp7);
    }
    return 0;
}

这是输出

代码语言:javascript
复制
Test#1
New operator overloading
New operator overloading
Delete operator overloading
Delete operator overloading
Test#2
New operator overloading
Delete operator overloading
Test#3
New operator overloading
Delete operator overloading
Test#4
New operator overloading
Running move2
Delete operator overloading

我想知道我对move2的实现是否正确,我能在生产中使用它吗?

更新:

我发现GCC实现了移动

代码语言:javascript
复制
  /**
   *  @brief  Convert a value to an rvalue.
   *  @param  __t  A thing of arbitrary type.
   *  @return The parameter cast to an rvalue-reference to allow moving it.
  */
  template<typename _Tp>
    constexpr typename std::remove_reference<_Tp>::type&&
    move(_Tp&& __t) noexcept
    { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-05 05:34:29

std::move()接收一个,并返回一个T&& rvalue引用。你的move2()也不知道。它接受一个lvalue引用,并按值返回一个T

您的代码“工作”是因为复制省略,避免在函数按值返回新对象时创建临时对象,从而允许直接使用对temp8的类型强制引用构造input,从而转移对其数据的所有权。不过,这并不是因为有了适当的move2()实现。

试一试:

代码语言:javascript
复制
template<typename T>
std::remove_reference_t<T>&& move2(T&& input) {
    ...
    return static_cast<std::remove_reference_t<T>&&>(input);
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69848787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档