c++ - 在共享缓冲区内存中创建一个::std::string 对象

标签 c++ string c++11 embedded

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

我对 ::std::string 构造函数描述的理解是,它将创建我提供的数据的拷贝。例如这个构造函数:

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

在哪里

char                        mApn[APN_MAX_SIZE];
int8_t                      mApnSize;

将创建一个位于 sharedBufferAddress 的对象,但其中的数据将被复制到堆上分配的缓冲区中。

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

最佳答案

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

一种选择是发展 Protobuf 的自定义实现或对现有 Protobuf 进行自定义修改。

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

关于c++ - 在共享缓冲区内存中创建一个::std::string 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52591397/

相关文章:

c++ - 如何处理高于 7FF 的十六进制值...64 位和 uint64_t 类型

c++ - 为什么这个 c++ 数组运算符的读取变体在一个类中没有被调用

c++ - 禁止隐式 `unsigned` 到 `double` 转换

c - 用C获取文件的扩展名

c++ - 在 C++11 中构建 union 元组

C++ 模板类继承自身

c++ - lzma 从内存中压缩/解压缩 C++

arrays - 如何使用输入数组重复字符串

c++ - 使用 std::string 作为缓冲区有缺点吗?

Javascript:搜索字符串时数组中的多个表达式