2016-12-07 153 views
0

我有一個類:優化類結構在C++

class A 
{ 
    double a; 
    map <int, double> b; 
    public: 
    A():a(0.0){} 
    A(const double aa, const map <int, double> & bb): a(aa), b(bb){} 
    A(double && aa, map <int, double> && bb):a(aa), b(bb) {} 
}; 

優化器(VS2012)示出了線A(a1*b1, std::move(bmap))花費的大部分時間。

我在這裏錯過了什麼可以加速對象構造嗎?我最近纔開始學習移動構造函數,所以我不確定我的移動構造函數或其使用是否最優化。更多的代碼

點點: 我

A operator *(double in) 
{ 
    if(in !=0.0) 
    { 
    map<int, double> tmp(b); //second bottleneck 
    for(auto & itr: tmp) 
     tmp.second *= in; 
    return A(in * a, std::move(tmp)); //first optimization bottleneck 
    } 
    return A(); 
} 
+0

你在做什麼?構造函數可能會佔用大部分時間,因爲您正在使用它(或濫用它,誰知道?)...... – MikMik

回答

2

不知道這是你的性能問題,的罪魁禍首,但你沒有實際移動到tmpA::b。你需要移動bbA::b,因爲bb是一個左:

A(double && aa, map <int, double> && bb):a(aa), b(std::move(bb)) {} 
//            ^^^^^^^^^^^^^ 

這裏有一個minimal example on wandbox,說明了問題。

+0

不應該自己發生,因爲我有'&&'? – user6386155

+0

@ user6386155:如果你在參數中有'&&',它意味着**你只接受右值引用**。一旦你得到一個右值引用,它就被綁定到'bb',這是一個左值*(即你可以說'auto ptr = &bb;')*。爲了讓'bb'再次成爲右值,你需要'std :: move'它。 –

+0

@ user6386155:[**此附加示例**](http://melpon.org/wandbox/permlink/R2EDogSZNEDTbty1)顯示正在創建副本。 –