我想知道两件事。
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)));
//...
}
答案 0 :(得分:0)
显然,移动std::tuple
可以大大提高速度。想象一下复制std::make_tuple(std::vector<int>(1000000, 0)¸ std::string(23456, 'H'))
。对于std::tuple<int, int, int>
,移动与复制没有什么不同。所以,
对于像三个整数一样简单的元组,可以通过constref传递它;或按值计算,尤其是当实际参数是临时参数时。
答案 1 :(得分:0)
std::tuple
已经支持移动语义,因此已经处理了数据传输。
如果要存储自己的类类型,则需要为类实现移动语义,否则,您将在元组中遇到任何类型的复制操作。
编译器可能会优化原始类型(例如整数)的输出,尽管这不是我所熟悉的底层细节。
如果要支持自己的类类型,可以考虑实现以下内容:
class MyClass
{
MyClass(MyClass&& m);
MyClass& operator =(MyClass&& m);
};