Создание объекта :: std :: string в общей буферной памяти - PullRequest
0 голосов
/ 01 октября 2018

Я использую Google protobuf во встроенном приложении с ограниченной памятью кучи.В настоящее время я пытаюсь заставить приложение использовать динамическое размещение только в качестве крайней меры.Для этого у меня есть общий буфер, на котором я создаю все прототипные сообщения или большинство из них.Кажется, все в порядке, за исключением случаев, когда протокольное сообщение ожидает параметр ::std::string.

В моем понимании описания конструкторов ::std::string я создаю копию предоставленных мною данных.,Например, этот конструктор:

s = new(sharedBufferAddress) ::std::string(mApn, mApnSize);

, где

char                        mApn[APN_MAX_SIZE];
int8_t                      mApnSize;

создаст объект, расположенный по адресу sharedBufferAddress, но данные внутри будут скопированы в буфер, назначенный в куче.

Вопрос в том, существует ли какой-либо способ получить указатель, возвращаемый функцией c_str() на некоторый указанный адрес.

1 Ответ

0 голосов
/ 01 октября 2018

Нельзя много сделать, чтобы взломать реализацию std::string.Все попытки будут делать что-то недопустимое и могут привести к неопределенному поведению.

Один из вариантов заключается в разработке пользовательской реализации Protobuf или пользовательских модификаций стандартного Protobuf. * ​​1004 *

Другой вариант - использовать существующие пользовательские реализации.Например, финский программист Петтери Аймонен реализовал реализацию Protobuf Nanopb в C для разработки встраиваемых систем и выпустил ее под лицензией zlib.Это может быть более полезным, чем пользовательский модифицированный стандартный Protobuf во встроенном проекте, поскольку C и C ++ работают сносно хорошо.

...