Tôi đang xem xét tối ưu hóa giá trị trả về trong trường hợp tuple/ties và hành vi tôi quan sát không như tôi mong đợi. Trong ví dụ dưới đây, tôi sẽ mong đợi di chuyển ngữ nghĩa để đá vào, mà nó làm, nhưng có một hoạt động sao chép mà vẫn còn. Đầu ra từ bên dưới được tối ưu hóa là:Tối ưu hóa giá trị trả về của tuple/tie
Test duo output, non_reference tuple
Default constructor invoked
Parameter constructor invoked
Copy constructor invoked
Move Assignment operator invoked
100
Việc yêu cầu người tạo bản sao làm cho bộ túp bên trong hàm có vẻ không cần thiết. Có cách nào để loại bỏ điều này không? Tôi đang sử dụng trình biên dịch MSVC 2012.
#include <iostream>
#include <tuple>
class A
{
public:
int value;
A() : value(-1)
{
std::cout << "Default constructor invoked" << std::endl;
}
explicit A(const int v) : value(v)
{
std::cout << "Parameter constructor invoked" << std::endl;
}
A(const A& rhs)
{
value = rhs.value;
std::cout << "Copy constructor invoked" << std::endl;
}
A(const A&& rhs)
{
value = rhs.value;
std::cout << "Move constructor invoked" << std::endl;
}
A& operator=(const A& rhs)
{
value = rhs.value;
std::cout << "Assignment operator invoked" << std::endl;
return *this;
}
A& operator=(const A&& rhs)
{
value = rhs.value;
std::cout << "Move Assignment operator invoked" << std::endl;
return *this;
}
};
std::tuple<A, int> return_two_non_reference_tuple()
{
A tmp(100);
return std::make_tuple(tmp, 99);
}
int main(int argc, char* argv[])
{
std::cout << "Test duo output, non_reference tuple" << std::endl;
A t3;
int v1;
std::tie(t3, v1) = return_two_non_reference_tuple();
std::cout << t3.value << std::endl << std::endl;
system("pause");
return 0;
}
Cảm ơn, đây là lựa chọn tốt cho trường hợp đơn giản, nhưng nếu có nhiều hành động hơn trên tmp và nhiều đầu ra hơn, nó sẽ không hoạt động. Và tôi không nghĩ rằng nó sẽ làm việc trong MSVC 2012. – thorsan
Sao chép elision đang xảy ra ở đây. Vấn đề là 'tmp' không được chuyển vào' tuple'. Các nhà xây dựng bản sao là từ sao chép 'tmp' vào tuple, không phải là tuple được sao chép. – Simple
@Simple Tôi biết rằng, có lẽ câu trả lời của tôi không đủ rõ ràng. – TartanLlama