@ProCxx

Страница 2234 из 2477
Dmitry
26.07.2018
06:15:45
Я не понимаю. Что он должен блокировать, чтение от чтения?
Ну например это просто глобально доступная срока, ptr<string>. Чтобы получить текущую версию, читателю надо скопировать ptr, если они делают это конкурентно, нужна блокировка.

Constantine
26.07.2018
06:22:26
Ну например это просто глобально доступная срока, ptr<string>. Чтобы получить текущую версию, читателю надо скопировать ptr, если они делают это конкурентно, нужна блокировка.
Яннп. Вы понимаете, что указатель на изначально неизменяемые данные? Что в конкурентной происходит только atomic increase ref count?

Dmitry
26.07.2018
06:26:55
Яннп. Вы понимаете, что указатель на изначально неизменяемые данные? Что в конкурентной происходит только atomic increase ref count?
Атомарно меняется счётчик, это да. Но эта атомарность передачи/разделения владения применяется когда владение уже гарантировано. Чтобы конкурентно завладевать нужен atomic<shared_ptr>.

Constantine
26.07.2018
06:28:15
Google
Constantine
26.07.2018
06:34:31
> Constantine Drozdov: это глобальные персистентные модели данных
https://ru.wiktionary.org/wiki/%D0%B3%D0%BB%D0%BE%D0%B1%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9

Constantine
26.07.2018
06:35:27
А можно сценарий когда стрельнет не атомарность shared_ptr при атомарном счетчике внутри?
shared_ptr не является потокобезопасным в смысле работы с переменной shared_ptr

Alexey
26.07.2018
06:35:59
Я понял. Но сценарий краха каков?

Constantine
26.07.2018
06:36:33
два потока перезаписывают указатель управляющего блока и потом не тот счетчик два раза меняется

Alexey
26.07.2018
06:39:20
Но в сценарии выше было только чтение вроде

С инкрементом счетчика

Dmitry
26.07.2018
06:53:53
Вы думаете, что весь транзакционный огород разводится, чтобы постоянно изменяемую глобальную переменную завести?
Ну если shared ptr используется без weak, я не понимаю зачем менять парадигму владения на unique ptr, можно с этим же ptr и его содержимым делать что угодно. Ну или почему не использовать intrusive если его unique гарантирует эксклюзивное владение.

Timur
26.07.2018
06:54:14
То что сейчас на сайте это, грубо говоря, внутренняя (рабочая) сборка из Microsoft, а не готовый продукт, соответственно, на нее лицензия не распространяется.
Я не думаю, что там есть лицензионные ограничения на компиляцию онлайн (у них с недавних пор есть публично доступный докер контейнер с vc build tools, о каких ограничениях речь?) Более правдивым предположением будет, что не так просто заставить vc2017 работать под Wine, с налету очевидно не получилось и он бросил, ждёт когда придут более мотивированные люди..

Timur
26.07.2018
07:00:28
Кто сейчас компилятор покупает? Берут Community edition, или просто инсталлятор (контейнер) BuildTools. Фискальных отношений тут не возникает

Google
Timur
26.07.2018
07:01:34
21 век на дворе, девопс-шмевопс, контейнеризация и облака. Майкрософт это всё уже умеет

Andrey
26.07.2018
07:07:00
То что технически build tools свободно скачиваются с сайта microsoft не значит, что вы имеете право использовать их для любых целей. Вот лицензионное соглашение https://visualstudio.microsoft.com/ru/license-terms/mlt553321/ какой его пункт разрешает делать штуки вроде gcc.godbolt.org?

Dmitry
26.07.2018
07:11:00
Нельзя менять значение под shared без уникального владения
Ну например написать strong_shared_ptr без weak счётчиков, тогда можно при условии unique().

Ну например написать strong_shared_ptr без weak счётчиков, тогда можно при условии unique().
Хм... Для shared_ptr release_if_unique мог бы возвращать shared_ptr с новым управляющим блоком.

Constantine
26.07.2018
07:20:16
Ну например написать strong_shared_ptr без weak счётчиков, тогда можно при условии unique().
Да, я уже ушел в сторону, что конструкции без weak это intrusive-модель

Chiveson
26.07.2018
07:59:52
А что не так с удалённой отладкой?
ну мне не хочется самому качать сорцы на виртуалку, собирать, запускать gdb-server, сейчас это делает скрипт, хочется кликать на одну кнопку в ide

Constantine
26.07.2018
08:06:44


Zodiak
26.07.2018
08:07:03
Мощно

Igor
26.07.2018
08:08:25
ну мне не хочется самому качать сорцы на виртуалку, собирать, запускать gdb-server, сейчас это делает скрипт, хочется кликать на одну кнопку в ide
Qt Creator в помощь https://puu.sh/B3kkP/78af9a8931.png после этого в kit указывается нужный девайс, и F5 начинает запускать ремот дебаг вместо обычного

Igor
26.07.2018
09:01:22
Считается что если у вас большой объект и нужны weak_ptr, то ваша ответственность не пользоваться make_shared https://stackoverflow.com/questions/32113594/weak-ptr-make-shared-and-memory-deallocation
полный праведного гнева "и почему Майерс, так топивший за make_shared, об этом не говорил ни слова", полез я в effective modern c++, а там... > If the object type is quite large and the time between destruction of the last std::shared_ptr and the last std::weak_ptr is significant, a lag can occur between when an object is destroyed and when the memory it occupied is freed и ещё абзаца четыре про эту проблему окай, кажется пришло время перечитывать классику :(

Spoonson
26.07.2018
09:02:52
Довольно странно кстати для меня, что не завезли make_shared с обычным выделением памяти, куда можно deleter запихнуть например.

Spoonson
26.07.2018
09:05:41
Но зачем? В чем преимущество перед new + конструктор shared_ptr?
не так красиво выглядит ? Хочется чтоб все было по феншую, и никакого new нигде

Igor
26.07.2018
09:05:43
в том что не нужно жонглировать в памяти граничными условиями "вот тут нужен строго make_shared, здесь нужен строго new + constructor, а там пофигу можно и так и эдак"?

Spoonson
26.07.2018
09:05:52
make_unique то есть

Igor
26.07.2018
09:07:11
кстати, чисто теоретически возможна такая реализация, в которой особождалась бы только та часть общей памяти, что нужна под объект, а часть под счётчики бы оставалась нетронутой? этакое if (strong_count==0) free(buffer+sizeof(bookkeping), buffer+sizeof(bookkeping)+sizeof(T))

Andrey
26.07.2018
09:07:27
Как вы себе это представляете сигнатуру make_shared принимающего еще и deleter? Неудобно же отделять параметры конструктора объекта от deleter'а.

make_unique то есть
Он появился до C++17, теперь у нас есть evaluation order guarantees и CTAD, что сильно уменьшило полезность всех этих "make_".

Google
Andrey
26.07.2018
09:11:14
make_shared_d<T, D, Args...> ¯\_(ツ)_/¯
И почему это перегрузка выбереться вместо обычного make_shared?

Spoonson
26.07.2018
09:11:26
Как вы себе это представляете сигнатуру make_shared принимающего еще и deleter? Неудобно же отделять параметры конструктора объекта от deleter'а.
Я думаю, можно найти какой-нибудь вариант. Хоть перегрузку с фейковым параметром, хоть другое название функции.

Igor
26.07.2018
09:11:39
потому что это не перегрузка, а функция с отдельным именем

Max
26.07.2018
09:12:29
Но зачем? В чем преимущество перед new + конструктор shared_ptr?
make_shared сделает на одну аллокацию меньше.

Andrey
26.07.2018
09:13:26
потому что это не перегрузка, а функция с отдельным именем
а ок, не заметил суффикс _d. Но перефразируя Ваш аргумент "вот тут нужен строго make_shared, здесь нужен make_shared_d ..."

Spoonson
26.07.2018
09:13:39
Он появился до C++17, теперь у нас есть evaluation order guarantees и CTAD, что сильно уменьшило полезность всех этих "make_".
А как evaluation order тут помогает/мешает? Можно спокойно делать foo(std::unique_ptr<Foo>(new Foo), std::unique_ptr<Foo>(new Foo))?

Max
26.07.2018
09:13:40
Но зачем? В чем преимущество перед new + конструктор shared_ptr?
И, кстати, exception-safety - если на второй аллокации вылетит bad_allock, то память утечёт.

Andrey
26.07.2018
09:14:22
make_shared сделает на одну аллокацию меньше.
Обсуждается вариант make_shared который не делает меньше аллокаций.

Igor
26.07.2018
09:15:07
а ок, не заметил суффикс _d. Но перефразируя Ваш аргумент "вот тут нужен строго make_shared, здесь нужен make_shared_d ..."
полностью согласен, но мне кажется "пользуйтесь вариантами make_shared()" проще запомнить чем "при Х пользуйтесь вариантами make_shared(), а при Y пользуйтесь new + shared_ptr()`

Max
26.07.2018
09:15:46
Обсуждается вариант make_shared который не делает меньше аллокаций.
Пардон. Совсем не умею читать целиком с последнего непрочитанного =)

Andrey
26.07.2018
09:15:56
Один аргумент foo полностью вычислится перед другим. В C++17 ничего не утечет.

А как evaluation order тут помогает/мешает? Можно спокойно делать foo(std::unique_ptr<Foo>(new Foo), std::unique_ptr<Foo>(new Foo))?

И, кстати, exception-safety - если на второй аллокации вылетит bad_allock, то память утечёт.

Spoonson
26.07.2018
09:17:08
полностью согласен, но мне кажется "пользуйтесь вариантами make_shared()" проще запомнить чем "при Х пользуйтесь вариантами make_shared(), а при Y пользуйтесь new + shared_ptr()`
Согласен с этим. В общем для меня в целом голый new выглядит подозрительно и каждый раз хочется проверить все ли тут правильно.

Max
26.07.2018
09:17:12
А как evaluation order тут помогает/мешает? Можно спокойно делать foo(std::unique_ptr<Foo>(new Foo), std::unique_ptr<Foo>(new Foo))?
std::unique_ptr<Foo>(new Foo) - до с++17 здесь потенциально утечка: Foo создастся, а ctor ptr'а кинет исключение.

Spoonson
26.07.2018
09:22:38
std::unique_ptr<Foo>(new Foo) - до с++17 здесь потенциально утечка: Foo создастся, а ctor ptr'а кинет исключение.
не, я думаю проблема либо в shared_ptr возможна (когда память для контрольного блока выделяется, но может быть там на этот случай что-то делается), либо когда в функцию сразу два передаются. А с одиноким unique_ptr никаких проблем быть не должно

Anatoly
26.07.2018
09:29:16
Видео с Cpp Russia 2018 завезли: https://www.youtube.com/watch?v=aI64OFHJDc4&list=PLZN9ZGiWZoZoFa2q0NqD6metQxavT2JYP&index=1

Igor
26.07.2018
09:30:21
так давно уже вроде, или там не всё было?

Anatoly
26.07.2018
09:32:32
так давно уже вроде, или там не всё было?
это, вроде, полный плейлист, но может быть уже и было

Google
Spoonson
26.07.2018
09:34:56
не, я думаю проблема либо в shared_ptr возможна (когда память для контрольного блока выделяется, но может быть там на этот случай что-то делается), либо когда в функцию сразу два передаются. А с одиноким unique_ptr никаких проблем быть не должно
действительно, если будет исключение при попытке выделения контрольного блока, то все будет ок: в libc++ это учтено https://github.com/llvm-mirror/libcxx/blob/master/include/memory#L4045 сначала указатель ложится в unique_ptr, ну или в другом месте try catch

Timothy
26.07.2018
09:48:28
привет, как избежать неявной конвертации в bool: https://ideone.com/EVGm4p (есть вариант в комменте, но может есть другие варианты?)

Max
26.07.2018
09:58:03
действительно, если будет исключение при попытке выделения контрольного блока, то все будет ок: в libc++ это учтено https://github.com/llvm-mirror/libcxx/blob/master/include/memory#L4045 сначала указатель ложится в unique_ptr, ну или в другом месте try catch
И правда. На самом деле, даже cppreference гарантирует: std::bad_alloc if required additional memory could not be obtained. May throw implementation-defined exception for other errors. delete ptr if T is not an array type, delete[] ptr otherwise) (since C++17) is called if an exception occurs (c) https://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr

Timothy
26.07.2018
10:01:07
интересное решение, нужно будет оставить на заметку
та вот хотелось бы чтобы не писать ничего)

Pavel
26.07.2018
10:03:47
та вот хотелось бы чтобы не писать ничего)
мне бы тоже, но вроде это в стандарте прописано, что указатели конвертируются в бул неявно (указатель на char в данном случае). я не знаю другого способа это избежать, самому интересно

Andrey
26.07.2018
10:04:49
привет, как избежать неявной конвертации в bool: https://ideone.com/EVGm4p (есть вариант в комменте, но может есть другие варианты?)
Не лучше Вашего варианта, но можно и так: #include <iostream> #include <type_traits> using namespace std; struct foo { template <typename T, typename = enable_if_t<is_same_v<T, bool>>> explicit foo(T a) { cout << a; } }; int main() { //foo{ "dd" }; foo{ true }; return 0; }

Pavel
26.07.2018
10:05:57
У тебя explicit - конструктор, что же тебе ещё надо?
всмысле? чтобы не вызывался неправильный конструктор например в таком случае https://ideone.com/BjfPPW

точнее не "неправильный", а "не ожидаемый"

если убрать строку, которую предложил sm86, то в третьем случае вызовется конструктор с бул

Юра Незнанов
26.07.2018
10:08:40
https://certification.mail.ru/tests/cpp/start/

проходил кто? я - так себе, 36/45

Constantine
26.07.2018
10:09:25
https://certification.mail.ru/tests/cpp/start/
есть хардкорные вещи

ой, там регаться надо, ну нафиг

Юра Незнанов
26.07.2018
10:09:53
есть хардкорные вещи
да, но кстати хоть кому-то интересно эти вещи пригождались ли?..

Ilia
26.07.2018
10:10:35
https://certification.mail.ru/tests/cpp/start/
Нахера тебе по доброй воле пополнять БД хрюшей из MR?

Constantine
26.07.2018
10:10:59
https://certification.mail.ru/tests/cpp/start/
пойду за эксперта проходить)

а нахрена мне знать создателя С++? :)

Pavel
26.07.2018
10:12:45
а нахрена мне знать создателя С++? :)
ну в данном случае странно его не знать, учитывая что он самые базовые книжки по плюсам написал

Google
Igor
26.07.2018
10:12:49
товарищи, а может кто-нибудь пояснить за ccache ? если у меня один набор сорцов, которые собираются в объектники в разных папках (tmp/hi3520-stable/main.o, tmp/hi3520-trunk/main.o), и я переключаюсь между ветками trunk и stable проекта - ccache должен у себя хранить разные версии объектников, или это выходит за рамки его компетенции?

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