다음 코드에서 std :: move가 아무런 효과가 없거나 완전히 잘못되었는지 파악할 수 없습니까? 클래스 Object
에는 이동 및 복사 생성자가 모두 정의되어 있습니다. 여기std :: move는 effeciency에 대한 return 문에 사용해야합니까?
template<typename T> template<typename F>
Object<T>& Object<T>::operator*=(const F& rhs)
{
for(int i = 0; i < dimension ; i++)
{
_inner[i] *= rhs;
}
return *this;
}
는 공동이다
첫째
template<typename T> template <typename F>
const Object<T> Object<T>::operator*(const F& rhs) const
{
return std::move(Object(*this) *= rhs); // We end in move constructor
}
번째 : 이동없이 : 이동과 마찬가지로
template<typename T> template <typename F>
const Object<T> Object<T>::operator*(const F& rhs) const
{
return Object(*this) *= rhs; // We end in copy constructor
}
*=
오퍼레이터 정의 드 그것을 테스트하는 데 사용
Object<double> test(4);
Object<double> test2(test * 4);
std::cout << test2; // works fine
결과 우리가 이동 생성자 단부 제 경우와 제에 우리가 복사 생성자에서 끝난다.
두 경우 모두 코드가 컴파일됩니다.
새로운 개체를 복사하는 대신 밖으로 이동하는 것이 더 빠르다고 가정하기 때문에 다른 하나보다 효율적입니까?
추가 정보 : 나는 다음과 같은 컴파일러를 사용 : 나는 가정 것이기 때문에 g ++ (우분투/리나 4.7.3-1ubuntu1는) 4.7.3
'const' 값을 반환하지 않고 명시 적으로'std :: move' 로컬 변수/임시 변수를 지정하지 않으면 (N) RVO를 금지합니다. 왜 당신의'operator * '를'Object tmp (* this);라고 쓰지 않을까요? tmp * = rhs; return tmp;'? 그런 식으로 컴파일러는 지역 변수를 반환하고 그것을 반환 할 때 자동으로 rvalue로 변환합니다. – Xeo
다음을보십시오 : http://stackoverflow.com/questions/4986673/c11-rvalues-and-move-semantics-confusion – Steve
방금'const'없이 테스트했는데 상황은 변하지 않았지만 이해할 수있었습니다. 내가'std :: move'가 필요로하는 답에서'lvalue'를 반환합니다. 반면에'rvalue'라면'std :: move'가 필요 없습니다. 마지막으로 임시 변수를 사용하면 자동으로 이동됩니다. – CodeTower