2016-12-07 7 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

Не уверен, если это является виновником ваших проблем с производительностью, , но вы на самом деле не движется tmp в A::b. Вы должны двигаться bb в A::b, потому что bb является именующим:

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

Вот minimal example on wandbox, который иллюстрирует эту проблему.

+0

не должен произойти сам по себе, так как у меня есть '&&'? – user6386155

+0

@ user6386155: если в параметре есть '&&', это означает, что ** вы принимаете только ссылки rvalue **. Как только вы получите ссылку rvalue, она «привязана» к 'bb', которая является lvalue * (то есть вы можете сказать' auto ptr = &bb; ') *. Чтобы снова ввести 'bb' значение rvalue, вам нужно' std :: move'. –

+0

@ user6386155: [** Этот дополнительный пример **] (http://melpon.org/wandbox/permlink/R2EDogSZNEDTbty1) показывает, что делается копия. –