Size: a a a

2021 February 08

CD

Constantine Drozdov in pro.cxx
Базовая мысль в том, что list<any_child_of<Base>> это почти не пессимизация для абсолютно той же структуры хранения. Скажем, логично ожидать alignof(max_align_t) в 16, а для двусвязного списка шапка это 2*sizeof(node*) те же 16
источник

DS

Dmitry Sokolov in pro.cxx
Constantine Drozdov
Так там и так rebind, причем обязательный
Но аллокатор то один и он под один node_type.
источник

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
Но аллокатор то один и он под один node_type.
Аллокатор это ребинд от параметра, который под value_type (шаблонный параметр)
источник

DS

Dmitry Sokolov in pro.cxx
Constantine Drozdov
Аллокатор это ребинд от параметра, который под value_type (шаблонный параметр)
А, имеется в виду возможность cast list<derived> к list<base>?
источник

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
А, имеется в виду возможность cast list<derived> к list<base>?
Это отдельная больная тема (только перемещение). Имеется в виду возможность класть Derived в list<Base>
источник

DS

Dmitry Sokolov in pro.cxx
Constantine Drozdov
Это отдельная больная тема (только перемещение). Имеется в виду возможность класть Derived в list<Base>
Ну так опять возвращаемся к аллокаторам :) для Derived он другой, а инстанциирован в списке для node<Base>.
источник

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
Ну так опять возвращаемся к аллокаторам :) для Derived он другой, а инстанциирован в списке для node<Base>.
Так списку дают Allocator для Base который и так уже будет использовано для Node через rebind
источник

DS

Dmitry Sokolov in pro.cxx
Constantine Drozdov
Так списку дают Allocator для Base который и так уже будет использовано для Node через rebind
Ну тогда Node должен знать все возможные Derived, иначе размер не посчитать. Получается list<variant>
источник

CD

Constantine Drozdov in pro.cxx
Дай тому же вижаку в std::list<int> аллокатор, который не ребиндается с int, работать не будет
источник

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
Ну тогда Node должен знать все возможные Derived, иначе размер не посчитать. Получается list<variant>
А зачем тебе знать размер
источник

DS

Dmitry Sokolov in pro.cxx
Constantine Drozdov
А зачем тебе знать размер
Потому что используется allocator.allocate(1).
источник

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
Потому что используется allocator.allocate(1).
В момент конструирования Derived ты знаешь размер, предвычислять не обязательно. Ты же можешь хранить unique_ptr<Base> не зная список всех Derived
источник

DS

Dmitry Sokolov in pro.cxx
Constantine Drozdov
В момент конструирования Derived ты знаешь размер, предвычислять не обязательно. Ты же можешь хранить unique_ptr<Base> не зная список всех Derived
Могу, но это уже будет не allocator.
источник

CD

Constantine Drozdov in pro.cxx
Constantine Drozdov
С оверхедом вроде бы просто
struct node { node*; node*; };
struct value_base : node { Base &; //локальная };
template <typename Derived> struct polymorphic : value_base { Derived value; polymorphic() : value_base(value) {} };
А еще можешь вот на таких структурах жить
источник

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
Могу, но это уже будет не allocator.
Почему?
источник

DS

Dmitry Sokolov in pro.cxx
Constantine Drozdov
В момент конструирования Derived ты знаешь размер, предвычислять не обязательно. Ты же можешь хранить unique_ptr<Base> не зная список всех Derived
В общем случае allocator statefull и он инстанциируется как rebind на конкретный тип ноды. Он не полиморфный.
источник

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
В общем случае allocator statefull и он инстанциируется как rebind на конкретный тип ноды. Он не полиморфный.
Мне непонятно, чему это мешает
источник

К1

Кот 13666777 in pro.cxx
Добрейшего всем вечерочка
источник

DS

Dmitry Sokolov in pro.cxx
Constantine Drozdov
Мне непонятно, чему это мешает
Ну там при работе не передается размер. Просто allocate(1 /*штука*/).
источник

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
Ну там при работе не передается размер. Просто allocate(1 /*штука*/).
Это все ещё ничему не мешает. При вызове allocate я знаю Derived, который аллоцирую
источник