我在堆内存有限的嵌入式应用程序中使用 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/