2012-11-22 2 views
1

기본 생성자에 인수를 전달할 때 std::move() 함수를 사용하면 생성 시간이 단축되는 이유는 무엇입니까? 이 예에서는 그래서 기본 클래스에 인수를 전달할 때 std :: move() 사용

struct Bar { 
    Bar(std::string); 

    std::string _s; 
} 

struct Foo : public Bar { 
    Foo(std::string); 
} 


struct Bar(std::string bs) : _s(std::move(bs)) { 
    // 1 
} 

struct Foo(std::string fs) : Bar(std::move(fs)) { 
    // 2 
} 

은 문자열의 추가 사본이 만들어지고 방지 Foo의 생성자에서 사용되는 move()합니까?

그리고 해명

,이 디자인은 시도를 의미하지 않는 점 // 1// 2에서 bsfs를 사용하도록해야한다, 그러나 _s를 사용하여 두 곳에서 안전 할 것인가?

#include <iostream> 

struct String 
{ 
    String() {} 
    String(const String&) {std::cout << "String(const String&)\n";} 
    String& operator=(const String&) 
     {std::cout << "String& operator=(const String&)\n"; return *this;} 
    String(String&&) {std::cout << "String(String&&)\n";} 
    String& operator=(String&&) 
     {std::cout << "String& operator=(String&&)\n"; return *this;} 
}; 

struct Bar { 
    Bar(String); 

    String _s; 
}; 

struct Foo : public Bar { 
    Foo(String); 
}; 


Bar::Bar(String bs) : _s(std::move(bs)) { 
    // 1 
} 

Foo::Foo(String fs) : Bar(std::move(fs)) { 
    // 2 
} 
int main() 
{ 
    Foo f{String()}; 
} 

이 출력합니다 나를 위해 :

답변

3

확인하려면, 정말 같은 가짜 String 클래스로 예를 코딩

String(String&&) 
String(String&&) 

하지만 난 Foo 생성자에서이 std::move를 제거하는 경우 인쇄물이 다음으로 변경됩니다.

String(const String&) 
String(String&&) 

따라서 String(String&&)을 가정하면 String(const String&)보다 빠르며 전자는 더 빠릅니다. 그렇지 않으면 아닙니다.

그리고 해명

,이 디자인은 시도는 포인트 // 1 // 2에서 학사 및 FS를 사용하려고해서는 안 의미 않지만, 사용 _s 두 곳 모두에서 안전 할 것인가?

수정.

+0

좋은 실험입니다. 고맙습니다. –

관련 문제