2012-11-22 41 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// 2bsfs,但使用_s會在這兩個地方是安全的?

回答

3

爲了找到答案,我重新編碼您的示例用假String類,像這樣:

#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()}; 
} 

對於我這種打印出:

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

但是,如果我從Foo構造函數刪除此std::move打印輸出變爲:

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

因此,假設String(String&&)String(const String&)快,前者更快。否則,不。

而且澄清,這是否意味着設計不應該嘗試 使用在點// 1和2 // BS和FS,但使用_s會在這兩個地方安全 ?

正確。

+0

這是一個很好的實驗;謝謝。 –