Таким образом, этот вопрос связан с предыдущим (std::string
без копирования из char*
).
Теперь я столкнулся с boost:interprocess::string
, который позволяет строить строки внутри адресного пространства общей памяти. Поскольку у меня уже есть память char*
, мне было интересно, могу ли я повторно использовать boost:interprocess::string
чтобы избежать копирования.
Однако каждый отдельный документ, который я читаю, использует boost::interprocess::managed_shared_memory
и его братьев и сестер.
Кто-нибудь использует строку с поддержкой boost без общей памяти? Как?
Благодарю!
Проблема заключается в том, что ваш символ * указывает на память вашего процесса (кучи), когда процесс больше не работает с этой памятью. Совместная память разделяется между процессами. Вы должны скопировать из char * в сегмент разделяемой памяти, на мой взгляд это единственный вариант. Скажите, пожалуйста, где ваш символ * указывает на кучу?
Но чтение из разделяемой памяти или файла с отображением памяти может быть выполнено без копирования, вы можете использовать такие контейнеры, как string_view, либо boost :: string_ref, либо boost :: string_view или в С++ 17 std :: string_view include <experimental/string_view>
. Это контейнеры без права собственности и позволяют ссылаться на память по {char *, size}
, однако, поскольку разделяемая память является общей, было бы трудно представить, может ли она когда-либо быть кодом качества продукции, поскольку любой процесс может изменить вашу память, если только вы никогда не пишите, а читайте только из SHM. По моему скромному мнению, ответ НЕТ. Однако я буду ждать более опытных разработчиков.
Краткий ответ: Нет.
Более длительный ответ: вы должны знать о своей реализации std::string
. См. Здесь, например, для libcxx LLVM. Вы можете получить свой char*
там, но это может быть связано с уродливыми хаками, и вы должны адаптировать свой код для любой реализации STL.