2016-12-07 3 views
0

I ont une classe:construction de classe d'optimisation en 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) {} 
}; 

L'optimiseur (VS2012) montre la ligne A(a1*b1, std::move(bmap)) prend la plupart du temps. Est-ce qu'il me manque quelque chose qui pourrait accélérer la construction de l'objet?

J'ai commencé à apprendre les constructeurs de mouvement seulement récemment, donc je ne suis pas sûr si mon constructeur de mouvement ou son utilisation optimale ou non.

peu plus sur le code: Je

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

Que faites-vous avec cette classe? Le constructeur pourrait prendre la plupart du temps parce que vous l'utilisez (ou en abusant, qui sait?) Fortement ... – MikMik

Répondre

2

Je ne sais pas si cela est le coupable de vos problèmes de performance, mais vous déplacez pas réellement tmp dans A::b. Vous devez déplacer bb en A::b, parce que bb est une lvalue:

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

Voici un minimal example on wandbox qui illustre la question.

+0

n'est pas censé se produire tout seul puisque j'ai '&&'? – user6386155

+0

@ user6386155: si vous avez '&&' dans le paramètre, cela signifie que ** vous n'acceptez que des références rvalue **. Une fois que vous obtenez une référence rvalue, elle est "liée" à 'bb', qui est une lvalue * (c'est-à-dire que vous pouvez dire' auto ptr = &bb; ') *. Pour rendre à nouveau 'bb' un rvalue, vous devez le' std :: move'. –

+0

@ user6386155: [** Cet exemple supplémentaire **] (http://melpon.org/wandbox/permlink/R2EDogSZNEDTbty1) montre qu'une copie est en cours. –