在共享缓冲区内存中创建 ::std::string 对象

Creating an ::std::string object in the shared buffer memory

本文关键字:std string 对象 创建 共享 缓冲区 内存      更新时间:2023-10-16

我在堆内存有限的嵌入式应用程序中使用Google protobuf。我目前正在尝试使应用程序仅将动态分配用作最后的手段。为此,我有一些共享缓冲区,您可以在其上创建所有原始消息或其中的大部分消息。一切似乎都正常,除了原型消息需要::std::string参数的情况。

我理解::std::string构造函数描述的方式是,它将创建我提供的数据的副本。例如,此构造函数:

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

哪里

char                        mApn[APN_MAX_SIZE];
int8_t                      mApnSize;

将创建一个位于共享缓冲区地址的对象,但内部的数据将被复制到堆上分配的缓冲区上。

问题是是否有某种方法可以让c_str()函数返回的指针指向某个指定地址。

你无法做太多破解std::string的实现。所有尝试都会做一些非法的事情,并可能导致未定义的行为。

一种选择是发展Protobuf的自定义实现或对库存Protobuf的自定义修改。

另一种选择是使用现有的自定义实现。例如,芬兰程序员Petteri Aimonen在C语言中实现了Protobuf实现Nanopb用于嵌入式开发,并在zlib许可下发布。这可能比嵌入式项目中的自定义修改库存 Protobuf 更有用,因为 C 和 C++ 可以很好地协同工作。