когда создавать объекты в куче против стека?

Взгляните на этот фрагмент кода:

class Profiler{
    const std::string id;
public:
    Profiler(const std::string id);
    Profiler(const Profiler &t);
//...
}

затем где-то в коде:

std::map<const std::string, Profiler> profilers;

и где-то еще я заполняю контейнер как:

profilers.insert(std::pair<const std::string, Profiler>(id, Profiler(id)));

Вышеупомянутая строка только что вызывала constructor и copy constructor 3 раза в общей сложности. один для создания временного Profiler, один для создания pair и один для insert, верно? profilers[id] = Profiler(id); также имеет такое же количество вызовов.

  1. есть ли способ уменьшить это число?
  2. разве не дешевле (в любых терминах) правильно изменить подписи, чтобы создать Profiler в куче и сохранить его адрес в map? (Profiler объектов маленькие)

Благодарность


person rahman    schedule 11.09.2014    source источник
comment
Лучше вместо этого использовать std::set с настраиваемым компаратором.   -  person Deduplicator    schedule 11.09.2014
comment
std::map по умолчанию будет хранить свои фактические данные из свободного хранилища (кучи). Стек займет лишь небольшая ручка.   -  person Galik    schedule 11.09.2014
comment
Если у вас есть C ++ 11, вы можете использовать profilers.emplace(), чтобы уменьшить количество копий.   -  person Galik    schedule 11.09.2014
comment
Имейте в виду, что операции со стеком и копирование данных обычно намного дешевле, чем выделение кучи, поэтому вполне может быть быстрее создавать дополнительные конструкторы копирования и т. Д .: stackoverflow.com/questions/2264969/   -  person Jeremy Friesner    schedule 11.09.2014


Ответы (1)


В моей ситуации, как и в другой моей ситуации, stack предпочтительнее. Почему? лучше прочтите их один:

  1. почему выделение памяти в куче намного медленнее, чем в стеке
  2. что ускоряет выделение стека или кучи
person rahman    schedule 12.09.2014