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

Nov 12, 2012 00:51

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

tech, publish

Leave a comment

_winnie November 12 2012, 14:06:37 UTC
Обычно в таких случаях лучше аналог std::list >, в каждом векторе заранее выделено константное и неменяющееся количество памяти. (list - не копирует элементы при добавлениях новых). Можно заабюзить 64-битное адресное пространство для этого (TLB - std::list, 4kb memory page - std::vector). std::deque примерно так делает, но не измерял его производительность. В моём STL из g++ (Debian 4.4) один блок в std::deque занимает 512 байт.

Reply

zeux November 12 2012, 15:37:40 UTC
В STL из MSVC блок в deque занимает кажется max(16, sizeof(T)) байт, достаточно бесполезный контейнер...

Reply

some41 November 12 2012, 18:36:09 UTC
deque вполне бы мог быть дефолтным контейнером для большого количества случаев, но, увы, им почти никто не пользуется, поэтому его имплементации часто оставляют желать

Reply

sleepy_drago November 12 2012, 19:20:55 UTC
его никто не использует именно потому что они не сделали размер блока параметром. хотя бы компиляции.

Reply

some41 November 12 2012, 19:27:34 UTC
в vector фактор роста не сделан параметром и как-то ничего, все равно его все используют, хотя я бы с удовольствием использовал меньше, чем х2.
хорошо выбранный дефолт часто важнее, чем возможность настройки. а в случае с deque это еще и вопрос известности.

Reply

sleepy_drago November 12 2012, 20:28:02 UTC
во более менее приличных реализациях уже некоторое время 3/2. И да я бы хотел параметром.

Reply

pshenichny November 13 2012, 07:37:34 UTC
А это что за реализации?
В EASTL двойка.

Reply

zeux November 13 2012, 08:24:35 UTC
В MSVC 1.5x, в gcc (libstdc++) 2x.
EASTL скопирована практически 1 в 1 с libstdc++, так что я не удивлен что там 2x.

Reply

some41 November 13 2012, 13:17:25 UTC
> В MSVC 1.5x
Это начиная с какой версии?

Reply

zeux November 13 2012, 15:42:23 UTC
C 2002 (7.0). MSVC6 - последняя с коэффициентом 2x.

Reply

some41 November 13 2012, 15:49:08 UTC
Ага, проверил в 2008, тоже 1.5

Reply


Leave a comment

Up