hash_map.insert vs []
- 19.03.09, 15:57
Часто в коде можно увидеть использование конструкции
typedef hash_map<Word32, class SomeClass> TSomeHashMap;
TSomeHashMap shm;
shm[10] = SomeClass(val1, val2);
Более оптимальный, в большинстве случаев, следующий код:
shm.insert(TSomeHashMap::value_type(10, SomeClass(val1, val2)));
Лишние затраты в первом случае получаются из-за того что оператор [] это фактически:
(*((shm.insert(TSomeHashMap::value_type(10, SomeClass()))).first)).second = SomeClass(val1, val2);
Т.е. Фактически вначале вызывается пустой конструктор, затем вызывается конструктор создания класса SomeClass с нужными значениями, затем вызывается конструктор копирования и заполняется пустой объект.
Во втором же случае вызывается конструктор создания класса SomeClass с нужными значениями, и сразу вызывается конструктор копирования, т.е. для классов с большим количеством полей разница будет существенная, для вариантов когда значением хеша является не класс, а какой-то атомарный тип, разницы нет.
typedef hash_map<Word32, class SomeClass> TSomeHashMap;
TSomeHashMap shm;
shm[10] = SomeClass(val1, val2);
Более оптимальный, в большинстве случаев, следующий код:
shm.insert(TSomeHashMap::value_type(10, SomeClass(val1, val2)));
Лишние затраты в первом случае получаются из-за того что оператор [] это фактически:
(*((shm.insert(TSomeHashMap::value_type(10, SomeClass()))).first)).second = SomeClass(val1, val2);
Т.е. Фактически вначале вызывается пустой конструктор, затем вызывается конструктор создания класса SomeClass с нужными значениями, затем вызывается конструктор копирования и заполняется пустой объект.
Во втором же случае вызывается конструктор создания класса SomeClass с нужными значениями, и сразу вызывается конструктор копирования, т.е. для классов с большим количеством полей разница будет существенная, для вариантов когда значением хеша является не класс, а какой-то атомарный тип, разницы нет.
3
Коментарі
Zerkella
120.03.09, 10:01
атОмарный пишется через О