Увеличить межпроцессную строку без разделяемой памяти

0

Таким образом, этот вопрос связан с предыдущим (std::string без копирования из char*).

Теперь я столкнулся с boost:interprocess::string, который позволяет строить строки внутри адресного пространства общей памяти. Поскольку у меня уже есть память char*, мне было интересно, могу ли я повторно использовать boost:interprocess::string чтобы избежать копирования.

Однако каждый отдельный документ, который я читаю, использует boost::interprocess::managed_shared_memory и его братьев и сестер.

Кто-нибудь использует строку с поддержкой boost без общей памяти? Как?

Благодарю!

Теги:
string
boost
boost-interprocess

2 ответа

0

Проблема заключается в том, что ваш символ * указывает на память вашего процесса (кучи), когда процесс больше не работает с этой памятью. Совместная память разделяется между процессами. Вы должны скопировать из char * в сегмент разделяемой памяти, на мой взгляд это единственный вариант. Скажите, пожалуйста, где ваш символ * указывает на кучу?

Но чтение из разделяемой памяти или файла с отображением памяти может быть выполнено без копирования, вы можете использовать такие контейнеры, как string_view, либо boost :: string_ref, либо boost :: string_view или в С++ 17 std :: string_view include <experimental/string_view>. Это контейнеры без права собственности и позволяют ссылаться на память по {char *, size}, однако, поскольку разделяемая память является общей, было бы трудно представить, может ли она когда-либо быть кодом качества продукции, поскольку любой процесс может изменить вашу память, если только вы никогда не пишите, а читайте только из SHM. По моему скромному мнению, ответ НЕТ. Однако я буду ждать более опытных разработчиков.

0

Краткий ответ: Нет.

Более длительный ответ: вы должны знать о своей реализации std::string. См. Здесь, например, для libcxx LLVM. Вы можете получить свой char* там, но это может быть связано с уродливыми хаками, и вы должны адаптировать свой код для любой реализации STL.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню