Publish @Zeux: Еще раз о выстрелах в ногу и STL

Nov 12, 2012 00:51

Вообще говоря, это вечная тема - сколько надо знать о деталях реализации, насколько можно полагаться на библиотеки итд итп. Тут история уже второго уровня - есть благие намерения и известно, что требуются дополнительные приседания в виде преаллокации массива, но пуля прилетает туда же, куда и обычно ( Read more... )

tech, publish

Leave a comment

some41 November 12 2012, 18:45:43 UTC
> vector.reserve(vector.size() + 24); - это $#^@* и насморк
+1
человек, который это пишет, не понимает как работает vector. делать reserve в цикле почти всегда тупо.
если хотелось улучшить, то можно было сделать reserve один раз на estimated_number_of_shapes * average_numer_of_vertices_per_shape или что-то такое. хотя и тут можно налететь, что если аллокировал меньше, чем надо, то при resize оно удвоится и станет огромным. а если бы просто без reserve вставлял, то доросло бы до гораздо меньшего размера.

Reply

zeux November 13 2012, 08:37:08 UTC
Разница с reserve на estimated когда не угадали и без reserve очень зависит от везения - если совсем нельзя посчитать заранее то наверное оптимально делать reserve(grow(shape_count * avg_vertices_per_shape)), где grow ведет себя так же как внутренний grow (ну и вообще, были бы отдельно reserve и reserve_exact aka reallocate, где reserve(count) = reallocate(grow(count)), и проблем бы не было...

А иначе да, соглашусь, человек который пишет reserve(size() + 24), не знает как реализован vector::reserve в популярных STL. Опять отмечу что с т.з. формальной разницы между reserve(size() + 24) и resize(size() + 24) в скорости быть не обязано - просто так получилось что reserve() exact, а resize() с grow.

Reply

some41 November 13 2012, 13:10:18 UTC
> Разница с reserve на estimated когда не угадали и без reserve очень зависит от везения
Именно так. Поэтому лучше хорошая дека.

> не знает как реализован vector::reserve в популярных STL
И как работает push_back в любом stl. Возможно он не ожидал квадрата, но зачем было вообще писать reserve? Что он должен был улучшить? Даже если бы он был не exact, то разницы бы не было со второй итерации цикла. Premature optimization как она есть.

Reply

zeux November 13 2012, 15:39:21 UTC
Полагаю, что reserve по инерции - в смысле там есть места где вершин не 24 а пара тысяч, и там reserve более оправдан, ну и тут типа за компанию. А вообще я не знаю, автора уже не найти и не спросить - возможно автор просто не думал.

Reply

some41 November 13 2012, 15:51:58 UTC
Если там тоже reserve в цикле, то он точно так же не нужен, не зависимо от инкремента

Reply


Leave a comment

Up