@ProCxx

Страница 2232 из 2477
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
А почему в std::shared_ptr убрали метод unique ?
Нет возможности атомарно проверить и что-то сделать на основе этого, емнип. Или я перепутал с use_count

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

Александр
25.07.2018
15:58:49
Я могу compare_exchange_strong(use_count, 1, 0);
Так он ж значение возвращает не атомик, которое уже через миг может быть изменено кем-то. Но судя по всему я не совсем в теме вопроса

Constantine
25.07.2018
15:59:48
Так он ж значение возвращает не атомик, которое уже через миг может быть изменено кем-то. Но судя по всему я не совсем в теме вопроса
Он возвращает не атомик, понятно, что нельзя просто сделать if (ptr.use_count() == 1) в многопоточной среде и думать, что в следующей строке use_count() не 2 Вопрос что если я его вытаскиваю, этой проблемы нет, все weak - ссылки отныне считают его nullptr

Kartonagnick
25.07.2018
15:59:52
Хочу прямо таки вытащить unique_ptr из shared_ptr
это противоречит дизайну шаред в общем случае

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

Google
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

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

Constantine
25.07.2018
16:17:39
@graninas врывайся в тред: http://eao197.blogspot.com/2018/07/progflame.html
я нынче сторонник императивного низа, функциональной середины и динамически-полиморфного верха

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
наиболее естественная реализация выглядит как вытаскивание данных из shared
естественным будет шарить там, где это нужно по смыслу. либо не шарить вообще. остальное отдаёт уг

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 нет.

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
Andrey
25.07.2018
16:38:41
Будет странно, я же клал объект с одним deleter'ом, получаю с другим

А кто очистит блок, если shared_ptr выделялся через std::make_shared?

Constantine
25.07.2018
16:41:23
Будет странно, я же клал объект с одним deleter'ом, получаю с другим
Хм... то есть надо возвращать unique_ptr<T, shared_deleter_wrapper<T>> ?

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
Мною изначально предполагается, что weak в этом случае должны считать, что lifetime объекта закончился
Они будут так считать, но они-то тоже читают из той памяти, владение которой мы передаем unique_ptr.

Constantine
25.07.2018
16:46:57
Они будут так считать, но они-то тоже читают из той памяти, владение которой мы передаем unique_ptr.
Я что-то не знаю про weak структуры в случае make_shared? Там аллоцируется один общий блок?

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 то надо два фрагмента выделять?

Constantine
25.07.2018
16:49:27
нет, зачем? а откуда число 56?
условный параметр на случай 64 alignment для new

чтобы не держать очень большие фрагменты памяти, а держать только маленький

там может и 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
это же буквальный перенос deleter-а на полученный unique_ptr будет
да, кажется, будет работать, только в if тогда не надо уменьшать счеткик до 0, оставить его 1

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
мы в точности внутрь unique_ptr положим логику, которая отработала бы при смерти shared_ptr
первым делом это логика уменьшает strongref и она очень удивится, что там уже 0

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

Andrey
25.07.2018
17:01:53
с точностью до того, что будет --weakref вместо --strongref
а, так :) 3-я логика — умирает не shared_ptr и не weak_ptr

кажется, что выходит монстр

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

Страница 2232 из 2477