
Alexey
25.07.2018
14:51:05

Nikita
25.07.2018
14:53:44
(это из своего опыта, на моём ноуте хромиум ~5 часов собирался, но у меня нет SSD, только 12ГБ оперативы)
Fastbuild?
Хм, выглядит интересно, осталось понять в чём подвох ?

Google

Alexey
25.07.2018
15:05:24

Constantine
25.07.2018
15:37:38
А почему в std::shared_ptr убрали метод unique ?

Дмитрий
25.07.2018
15:38:43
> This function was deprecated in C++17 and removed in C++20 because use_count is only an approximation in multithreaded environment (see Notes in use_count)

Constantine
25.07.2018
15:39:47
А почему не переделали в detach_unique_ptr?

Александр
25.07.2018
15:56:06

Constantine
25.07.2018
15:57:46
Хочу прямо таки вытащить unique_ptr из shared_ptr

Александр
25.07.2018
15:58:49

Constantine
25.07.2018
15:59:48

Kartonagnick
25.07.2018
15:59:52

Constantine
25.07.2018
16:00:10

Kartonagnick
25.07.2018
16:00:46
он там с кем то расшарился.
юником ресурс уже не сделаешь

Александр
25.07.2018
16:02:31

Google

Constantine
25.07.2018
16:03:14

Kartonagnick
25.07.2018
16:03:21
потому что это противоречит дизайну.
почему?
ты вообще знаешь, что такое шаред, и зачем он нужен?

Constantine
25.07.2018
16:04:13
кажется, да

Kartonagnick
25.07.2018
16:04:44
тогда должег почему шаред внезапно может расшариццо

Constantine
25.07.2018
16:05:29
если на него нет weakref и strongref равен 1 он никогда не может расшариться так уж внезапно

Kartonagnick
25.07.2018
16:07:21
если вам не нужно шарить, значит вам не нужен шаред.
можете сразу брать юник

Constantine
25.07.2018
16:08:41
мне нужен метод, который создаст уникальную версию объекта
он имеет право разрушить объект

Kartonagnick
25.07.2018
16:09:16
локай, копируй.

Constantine
25.07.2018
16:11:53
это асимптотически ухудшает код
почти всегда счетчик равен 1

Alexander
25.07.2018
16:15:26
@graninas врывайся в тред: http://eao197.blogspot.com/2018/07/progflame.html

Xessao
25.07.2018
16:16:16

Alexander
25.07.2018
16:16:43
ну так ЛОР же

Constantine
25.07.2018
16:17:39

Kartonagnick
25.07.2018
16:17:39

Constantine
25.07.2018
16:18:20
shared_ptr<const T> без non-const ссылок используется в качестве типа-значения
при запросе модификации данных создается копия, лишняя копия 1М памяти под неатомарно записанную операцию это такое

Google

Constantine
25.07.2018
16:21:27
наиболее естественная реализация выглядит как вытаскивание данных из shared
вторая по естественности - использование policy-based intrusive с явным указанием возможности многопоточности, вычисленного по целевому типу

Kartonagnick
25.07.2018
16:22:43

Constantine
25.07.2018
16:23:16
вы понимаете, что такое персистентные структуры данных?
https://en.wikipedia.org/wiki/Persistent_data_structure
перемещение узлов без аллокации памяти в них принципиальнейшая оптимизация, если все операции изначально не сгруппированы в транзакции

Andrey
25.07.2018
16:27:47
Даже с методом unique() Вам же еще нужен метод release, а его у shared_ptr нет.

Александр
25.07.2018
16:33:20

Constantine
25.07.2018
16:34:06

Andrey
25.07.2018
16:35:09

Александр
25.07.2018
16:35:39
Плоховато Евгений набрасывает. Все "аргументы" я уже тысячу раз слышпл, хоть бы новых придумали

Constantine
25.07.2018
16:36:54
Что именно?
грубо говоря
unique_ptr<T> release_if_unique() && {
if (compare_exchange_strong(use_counter_, 1, 0)) {
return { pointer() };
}
return {};
}

Andrey
25.07.2018
16:37:48

Constantine
25.07.2018
16:38:06

Andrey
25.07.2018
16:38:41
Будет странно, я же клал объект с одним deleter'ом, получаю с другим
А кто очистит блок, если shared_ptr выделялся через std::make_shared?

Constantine
25.07.2018
16:41:23

Andrey
25.07.2018
16:43:51
Это во-первых, + надо вместе с compare_exchange_strong(use_counter_, 1, 0) атомарно проверить, что weak_counter == 0, иначе оставшиеся в живых weak_ptr'ы огорчатся, ведь так?

Constantine
25.07.2018
16:44:29
Мною изначально предполагается, что weak в этом случае должны считать, что lifetime объекта закончился
На самом деле это следствие изначальной модели, в которой weak вообще нет и intrusive подходит лучше

Google

Andrey
25.07.2018
16:46:33

Constantine
25.07.2018
16:46:57

Andrey
25.07.2018
16:47:10
и он живет, пока жив хоть один shared_ptr или weak_ptr

Constantine
25.07.2018
16:47:29
да
и весь фрагмент памяти держится до последнего weak?

Andrey
25.07.2018
16:47:35
да

Kartonagnick
25.07.2018
16:47:44
если нужно ограбить шаред, и отдать ресурс юнику, то можно грабануть сам ресурс.
шаред и уник вообще трогать менять не нужно

Constantine
25.07.2018
16:48:21
да
хотя бы оптимизируют, что если sizeof(object) > 56 то надо два фрагмента выделять?

Andrey
25.07.2018
16:49:07

Constantine
25.07.2018
16:49:27
чтобы не держать очень большие фрагменты памяти, а держать только маленький
там может и 4K sizeof-ом быть

Kartonagnick
25.07.2018
16:50:53
там парочка счетчиков, указатель на ресурс, и указатель на тайп-ерейж

Andrey
25.07.2018
16:52:10
Считается что если у вас большой объект и нужны weak_ptr, то ваша ответственность не пользоваться make_shared
https://stackoverflow.com/questions/32113594/weak-ptr-make-shared-and-memory-deallocation

Constantine
25.07.2018
16:52:18
да, я понял
да, в такой модели совершенно точно нужно проверять weak-и
хотя стоп, нет, все еще не обязательно, default_shared_deleter сделает как надо
это же буквальный перенос deleter-а на полученный unique_ptr будет
а, ОЙ

Andrey
25.07.2018
16:57:04

Google

Constantine
25.07.2018
16:57:18
надо, видимо, еще инкрементить счетчик weak
т.е. strongref в 0, weakref++
чтобы нам последний weak_ptr не грохнул блок
нужно найти второй use case или делать отдельный параметр/функцию для поведения при наличии weak - это факт
хотя всякие shared_from_this в действительности очень сильно мусорят в weak ref counter

Andrey
25.07.2018
16:59:32
т.е. strongref в 0, weakref++
с одой стороны надо так, с другой, тогда deleter нашего unique_ptr (shared_deleter_wrapper<T>) не вызывет deleter для самого объекта

Constantine
25.07.2018
17:00:11
мы в точности внутрь unique_ptr положим логику, которая отработала бы при смерти shared_ptr
кажется, этого достаточно, чтобы не было проблем
с точностью до того, что будет --weakref вместо --strongref

Andrey
25.07.2018
17:01:06

Constantine
25.07.2018
17:01:36
а результат --strongref изначально считается 0

Andrey
25.07.2018
17:01:53
кажется, что выходит монстр

Constantine
25.07.2018
17:03:03
хех, на самом деле можно просто pair<old_deleter, weak_ptr> положить
и вызвать old_deleter(), а потом отпустить weak_ptr

Andrey
25.07.2018
17:03:35
как упражнение интересно, но в стандартной библиотеке никому не захочется такое иметь

Constantine
25.07.2018
17:04:04
это суперпринципиальная оптимизация, хотя она естественнее для intrusive_ptr, да
или для shared_nonpolymorphic_default_delete_no_weak_support_ptr

Evgeniy
25.07.2018
17:05:41