
Andrei
27.03.2017
12:24:41
А указатель ты как проверишь?
Нужно следить.
В противном случае ты не следишь и у тебя объект никогда может не умереть и непонятно когда он умирает.

Google

babysitter
27.03.2017
12:26:32
зачем тогда вообще юник поинтер, сделай локальный объект на стеке, наплоди объектов со ссылками и работай с ними в скоупе одном. не всегда же все просто

Дед Пегас
27.03.2017
12:26:53
Онтопчик http://manu343726.github.io/2017/03/13/lock-free-job-stealing-task-system-with-modern-c.html

Andrei
27.03.2017
12:27:08
Но никакой проблемы в классе иметь контейнер или просто филд с юник_птром нет.
Все объекты которые там сложены имеют владельцем инстанс твоего класса.
Всё четко.

babysitter
27.03.2017
12:28:16
я понимаю аргументы, есть просто места, где очень удобно использовать шареды на константу
есть просто крутые приемчики типа таких https://youtu.be/vxv74Mjt9_0?t=33m15s

Дед Пегас
27.03.2017
12:29:22
Нужны boxed!
Интересно, а можно ли эмулировать в плюсах время жизни как в расте?

Andrei
27.03.2017
12:30:40

Александр
27.03.2017
12:30:45

Google

Andrei
27.03.2017
12:31:49
плюс мув
плюс референсы
Эмулируют поведение как в расте
В точности.

Surreal
27.03.2017
12:32:47

Oleg
27.03.2017
12:41:15
Hello
А чего .o файлы имеют разную контрольную сумму при пересборке?
Они хранят в себе дату или что?
На глазок оличие в пару байт

Stanislav
27.03.2017
12:42:42
-frandom-seed=string
This option provides a seed that GCC uses in place of random numbers in generating certain symbol names that have to be different in every compiled file. It is also used to place unique stamps in coverage data files and the object files that produce them. You can use the -frandom-seed option to produce reproducibly identical object files.

Дед Пегас
27.03.2017
12:42:44

Stanislav
27.03.2017
12:43:16

Oleg
27.03.2017
12:44:36

Stanislav
27.03.2017
12:45:24
Сеньку
правда там такое еще The string should be different for every file you compile

Anton
27.03.2017
12:45:41
Ок, еще спрошу про unique_ptr. Вот у меня есть функция, которая создает объект A и возвращает unique_ptr<A>. Дальше, я добавляю его в контейнер std::map<int, unique_ptr<A». Как только я заполнил контейнер мне надо его скопировать в другой такой же контейнер и очистить. Собственно вопрос как скопировать std::map<int, unique_ptr> в такой же? С shared_ptr я просто делаю cont1 = cont2 и далее cont2.clear();

Evgeniy
27.03.2017
12:46:10

Andrei
27.03.2017
12:46:45

Anton
27.03.2017
12:47:23
можно конструкцию)) я понимаю что можно мувнуть)) синтаксически как это сделать?

Evgeniy
27.03.2017
12:47:52

Google

Anton
27.03.2017
12:48:04
пошел пробовать, спасибо!

Andrei
27.03.2017
12:48:52
newContainer = std::move(oldContainer);
Или если в конструкторе, то прям newContainer(std::move(oldContainer));

Anton
27.03.2017
12:49:44
не не. контейнер существует уже

Matway
27.03.2017
12:54:37

Anton
27.03.2017
12:57:47
Еще интересный момент возник. А как мне вернуть из контейнера std::map<int, unique_ptr<A» указатель на объект A по индексу i. в функцию с такой вот сигнатурой take_A(A *a);

Andrei
27.03.2017
12:58:06
map[i].get()

Anton
27.03.2017
13:00:50
владение объектом само собой передается?
глупость спросил))
get у нас вернет указатель на объект в unique_ptr, а сам unique_ptr останется или как? не очень этот момент понятен

Andrei
27.03.2017
13:02:51
Да, с самим объектом ничего не будет.
Просто вернёт указатель.

Anton
27.03.2017
13:03:17
аа он const вернет

Tema
27.03.2017
13:03:28

Anton
27.03.2017
13:03:46
pointer get() const;
Это из cppreference

babysitter
27.03.2017
13:04:08
это значит, что метод сам по себе не меняет содержимое объекта
поля объекта unique_ptr

Tema
27.03.2017
13:04:31
да да

Anton
27.03.2017
13:05:09
а если в функции кто-нибудь попытается освободить память по указателю, то что станет с unique_ptr? Тут гарантий получается нет?

Google

babysitter
27.03.2017
13:05:50
звучит как дикие хаки какие-то
используешь умные указатели — забудь про ручное освобождение памяти

Tema
27.03.2017
13:06:36
ибо нехуй

Anton
27.03.2017
13:07:06
ну тут такое...)) это объекты protobuf. и я их передаю в функцию set_allocated_ Есть подозрение что он удаляет эти объекты после отработки

Andrei
27.03.2017
13:07:37
С протобуфом надо по-совему обращаться да.
Протобуф сам отслеживает время жизни.

Anton
27.03.2017
13:08:28

Andrei
27.03.2017
13:08:44
Но по-хорошему ты можешь спокойно брать тупо указатели на подполя и подобъекты протобуфовского объекта, покуда сам объект жив.
У себя в проекте я именно так и делаю.
Хотя я стараюсь нигде протобуф объекты не хранить а использовать прямо по месту на стеке.

Tema
27.03.2017
13:09:46
все поля называются маленькими буквами
через ()

Anton
27.03.2017
13:10:08
ну привыкаешь))

Tema
27.03.2017
13:10:14
ппц

Anton
27.03.2017
13:10:20
да лааадно

Tema
27.03.2017
13:10:38

Google

Anton
27.03.2017
13:10:42
там код генерируется жесткий. ну по крайней мере для меня. а уж имена... хрен с ними

mefest
27.03.2017
13:11:06

Tema
27.03.2017
13:11:08

Anton
27.03.2017
13:11:16
Наследуются от google::protobuf::Message все

Tema
27.03.2017
13:11:19
??

Aleksei
27.03.2017
13:11:25
вот. поэтому скорее всего освобождаться память будет дважды насколько я понял
https://developers.google.com/protocol-buffers/docs/reference/cpp-generated#proto3_string
Цитата:
void set_allocated_foo(string* value): .... the message takes ownership of the allocated string object ....
string* release_foo(): Releases the ownership of the field and returns the pointer of the string object.....
Если делаешь set_allocated, который берешь из юника, то потом релиз сделай
И не будет двух удалений

Matway
27.03.2017
13:12:49
Не потом, а сразу.

Tema
27.03.2017
13:12:49

Aleksei
27.03.2017
13:13:37
Немного не ту ссылку дал, там на строки
https://developers.google.com/protocol-buffers/docs/reference/cpp-generated#embeddedmessage
Про объекты

Tema
27.03.2017
13:17:19

Anton
27.03.2017
13:20:36
message Battery {
required uint32 id = 1;
required int32 u = 2;
required int32 t = 3;
}
вот пример

Tema
27.03.2017
13:21:08
ппц \
человек будет делать Battery.t()
вот дофига прозрачно

Anton
27.03.2017
13:21:44
bat.set_id(12);