Size: a a a

2020 July 25

s

std::slavik in supapro.cxx
неявно выделение в куче происходит или как?
источник

s

std::slavik in supapro.cxx
или это UB?
источник

IZ

Ilia Zviagin in supapro.cxx
std::slavik
неявно выделение в куче происходит или как?
Ничего неявного там не происходит
источник

IZ

Ilia Zviagin in supapro.cxx
std::slavik
Вопрос про move семантику - почему это работает? В одном потоке выделяю на стеке объект структуры, передаю через очередь и move в другой поток, поидее после этого выход из функции происходит и объекты уничтожаются, но работает
 mail_t mail;//= new mail_t;
 mail.type = MessageType_t::SCENARIO_SET;
 const char *cmsg = (const char *)string_buffer_p;
 mail.cmsg = cmsg;
 while(!queue_js_app_rx.push(std::move(mail))){};
Я не вижу тут причин, почему это не должно работать, если всё остальное правильно написано.
источник

NI

Nikita Ivanov in supapro.cxx
да.
источник

N

Nano in supapro.cxx
std::slavik
Вопрос про move семантику - почему это работает? В одном потоке выделяю на стеке объект структуры, передаю через очередь и move в другой поток, поидее после этого выход из функции происходит и объекты уничтожаются, но работает
 mail_t mail;//= new mail_t;
 mail.type = MessageType_t::SCENARIO_SET;
 const char *cmsg = (const char *)string_buffer_p;
 mail.cmsg = cmsg;
 while(!queue_js_app_rx.push(std::move(mail))){};
По сути move это всё равно что передача указателя, если очень упростить. Сами данные у тебя уже где-то лежат, может в куче, может в сегменте глобальных данных. Например, где у тебя хранится string_buffer_p?
источник

s

std::slavik in supapro.cxx
Nano
По сути move это всё равно что передача указателя, если очень упростить. Сами данные у тебя уже где-то лежат, может в куче, может в сегменте глобальных данных. Например, где у тебя хранится string_buffer_p?
в куче, собственно вопрос к чему - если это UB - то при вызове повторном функции которая это создает - может просто по этому месту в памяти стек нового вызова перезаписаться
источник

s

std::slavik in supapro.cxx
указатель то передан, но память на которую он указывает не в куче находится, а в области стека
источник

N

Nano in supapro.cxx
std::slavik
в куче, собственно вопрос к чему - если это UB - то при вызове повторном функции которая это создает - может просто по этому месту в памяти стек нового вызова перезаписаться
Ну тогда и после move будет в куче
источник

s

std::slavik in supapro.cxx
Nano
Ну тогда и после move будет в куче
это только string_buffer_p
источник

s

std::slavik in supapro.cxx
а сам объект mail
источник

N

Nano in supapro.cxx
std::slavik
это только string_buffer_p
Остальные данные скопируются
источник

s

std::slavik in supapro.cxx
но ведь move не копирует
источник

N

Nano in supapro.cxx
std::slavik
но ведь move не копирует
Данные что на стеке скопируются. Как и обычно, когда функция что-то возвращает по значению. А то что в куче так там и будет.
источник

s

std::slavik in supapro.cxx
то есть move если не может обеспечить перемещение - делает копирование?
источник

s

std::slavik in supapro.cxx
насколько я понимаю - move работает через unique_ptr
источник

AS

Anatoly Shirokov in supapro.cxx
std::slavik
насколько я понимаю - move работает через unique_ptr
источник

s

std::slavik in supapro.cxx
но не обязательно явно создавать его - вот интересно стало как это все-таки работает
источник

N

Nano in supapro.cxx
std::slavik
то есть move если не может обеспечить перемещение - делает копирование?
Ну вообще, как в классе написан конструктор перемещения, так оно и работает. Можно посмотреть реализацию таких классов, которые чем-то владеют на куче, например string или vector. По сути, они просто передают указатели на данные другому объекту (свои указатели устанавилвают на null, чтобы в деструкторе проверить, нужно ли освободжать память или нет). Если конструктор перемещения реализован автоматически, то насколько я знаю, он просто делает move всех своих полей.
источник

N

Nano in supapro.cxx
Просто так сложно объяснить) Лучше где-то почитать про это и попробовать написать свои конструкторы перемещения
источник