C++ std::tuple和move语义

C++ std::tuple和move语义,c++,c++11,stdtuple,stdmove,C++,C++11,Stdtuple,Stdmove,我想知道两件事。 1.移动std::tuple是否值得实现?例如,对于std::tuple我们会得到什么?它会比复制或通过引用传递更快吗? 2.在下面给出的例子中,这两者之间有什么真正的区别吗 void print_tuple(const std::tuple<int&&, int&&, int&&> position) { int x = std::get<0>(position); int y = std

我想知道两件事。
1.移动
std::tuple
是否值得实现?例如,对于
std::tuple
我们会得到什么?它会比复制或通过引用传递更快吗?
2.在下面给出的例子中,这两者之间有什么真正的区别吗

void print_tuple(const std::tuple<int&&, int&&, int&&> position)
{
    int x = std::get<0>(position);
    int y = std::get<1>(position);
    int z = std::get<2>(position);

    std::cout << "x: " << x << " y: " << y << " z: " << z << std::endl;
}

void print_tuple(const std::tuple<int, int, int>&& position)
{
    int x = std::get<0>(position);
    int y = std::get<1>(position);
    int z = std::get<2>(position);

    std::cout << "x: " << x << " y: " << y << " z: " << z << std::endl;
}

int main()
{
    print_tuple(std::forward_as_tuple(1, 2, 3));
    print_tuple(std::move(std::tuple<int, int, int>(4, 5, 6)));
    //...
}
void print\u tuple(常量std::tuple位置)
{
INTX=std::get(位置);
int y=std::get(位置);
intz=std::get(位置);
标准::cout
  • 显然,移动
    std::tuple
    可以带来巨大的加速。想象一下复制
    std::make_tuple(std::vector(1000000,0)¸std::string(23456,'H'))
    。对于
    std::tuple
    来说,移动与复制没有任何区别。因此

  • 对于像三个整数这样简单的元组,可以通过constref传递,也可以通过值传递,特别是当实际参数是临时参数时


  • std::tuple
    已经支持移动语义,因此已经处理了数据传输。 如果您想存储自己的类类型,您需要为您的类实现移动语义,否则您将遇到元组中任何类型的复制操作

    编译器可能会优化原始类型(如整数)的移出,尽管这不是我熟悉的低级细节

    如果希望支持自己的类类型,可以考虑实现以下功能:

    class MyClass
    {
        MyClass(MyClass&& m);
        MyClass& operator =(MyClass&& m);
    };
    

    关于第二个问题,很容易找到:构建(启用优化)并比较生成的代码。