const std::unique_ptr<string> t = std::make_unique<std::string>(text);
on_send_text_shim(*this, t);
}
void on_send_text_shim(MyClass& self, std::unique_ptr<std::string>& text) noexcept;
Нужна ли в const std::unique_ptr<string> t ссылка для t? Копирование по идее очень дёшево для unique_ptr или всё же нет?
1. Зачем unique_ptr на стринг? 2. Зачем ссылка на unique_ptr?
Нужна какая-нибудь ссылка, чтобы не передавать string по значению.
Почему не использовать его по назначению и не смувить?
Unique PTR не копируется @supapro
Нужна какая-нибудь ссылка, чтобы не передавать string по значению. По значению передавать нельзя, потому что FFI.
Я поэтому и мучу unique_ptr, чтобы не оставлять ссылку на временный объект. Но здесь я начинаю плыть, поэтому и спрашиваю. То есть можно попытаться сделать такую сигнатуру шима: ``` void on_send_text_shim(MyClass& self, std::string& text) noexcept; ``` это мне кажется небезопасным, но возможно я не прав.
А просто string передать?
Поэтому вы делаете как минимум одну копию?
Вот так? void on_send_text_shim(MyClass& self, std::string text) noexcept; Нельзя, должна быть какая-то ссылка обязательно. Или умный указатель. Это ограничение FFI, если интересно, то вот https://github.com/dtolnay/cxx/issues/250 Передать string по значению нельзя из-за возможных оптимизаций, которые std::string может применять внутри себя.
Ой, надо было делать std::make_unique<std::string>(&text)?
Вообще не надо было делать этого
Ну хорошо, рвалью ссылку сделать нельзя?
Ты (можно на ты?) просто предлагаешь так? void on_send_text_shim(MyClass& self, std::string& text) noexcept; Меня смущает, что этот text — временный объект.
Я спрашиваю в чём проблема сделать std::string&& text. Можно на ты
А, ну проблема примерно та же: если предположим std::string содержит какую-то оптимизацию для маленьких строк, и вместо указателей будет содержать сам буфер, или там какие-то указатели на свои же кишки, то всё взорвётся на стороне Rust. Единственный способ избежать этого — передавать туда по ссылке, указателю или умному указателю.
Ну а умный указатель по значению тоже нельзя? Там ведь будет не копия, а тот же объект. Ну или можно сделать уже shared_ptr
Можно, я поэтому и лепил unique_ptr здесь https://t.me/ProCxx/442902
Так здесь не копия, ни рыба, ни мясо. Мне кажется, ты не особо знаешь move-семантику?
Я ржавую мув-семантику знаю, а в C++ особо нет, поверхностно.
Ну вот принимал бы просто юник птр, а на вызывающей стороне писал std::move(t). Хотя рассмотри string_view сначала, конечно, если подойдёт
Возвращаясь к баранам, вот так безопасно? void MyClass::onSendText(std::string text) noexcept { on_send_text_shim(*this, t); } void on_send_text_shim(MyClass& self, std::string& text) noexcept; (зы, сигнатуру onSendText я менять не могу, строка принимается по значению)
С прошедшим тебя Днём Советской Космонавтики, коллега. Мне тоже смешно, что я пытаюсь родить на C++, но нужно.
Хз, спасибо и тебя, я вообще новичок , и эти слова единственное что я понял
Благодарю!
Если в onsend не сохранишь куда-нибудь
Копирование для unique ptr очень дорого: оно вообще невозможно.
Обсуждают сегодня