0

我想知道两件事。
1.搬家std::tuple值得吗?例如,std::tuple<int, int, int>我们会得到什么吗?它会比复制或通过引用传递更快吗?
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)));
    //...
}
4

2 回答 2

0
  1. 显然,移动std::tuple 可以带来巨大的加速。想象一下复制一个std::make_tuple(std::vector<int>(1000000, 0)¸ std::string(23456, 'H')). 因为std::tuple<int, int, int>移动与复制没有什么不同。所以,

  2. 对于像三个整数这样简单的元组,您可以通过 constref 传递它;或完全按价值计算,尤其是当实际参数是暂时的时。

于 2018-07-02T21:17:37.510 回答
0

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

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

如果您想支持自己的类类型,您可以考虑实现以下内容:

class MyClass
{
    MyClass(MyClass&& m);
    MyClass& operator =(MyClass&& m);
};
于 2018-07-02T21:27:40.370 回答