【问题标题】:Creating an ::std::string object in the shared buffer memory在共享缓冲内存中创建 ::std::string 对象
【发布时间】:2019-03-06 13:55:33
【问题描述】:

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

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

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

在哪里

char                        mApn[APN_MAX_SIZE];
int8_t                      mApnSize;

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

问题是有没有办法让c_str()函数返回的指针指向某个指定的地址。

【问题讨论】:

  • 这可能会提供一个解决方案:stackoverflow.com/questions/5312714/…
  • String 将采用自定义缓冲区分配器作为参数,因此这可能是您前进的方向。 explicit basic_string( const Allocator& alloc );
  • 请原谅我对嵌入式系统细节的无知,但是否可以创建自己的分配器来在您想要的任何位置(堆栈或堆)分配内存?如果我了解分配器的工作原理,您可以创建一个只能在堆栈上分配的分配器,如果它超过编译时允许的大小,则会引发异常。该分配器应该是您的共享内存的管理器。
  • @ÖöTiib 究竟是什么未定义?我听不懂你在说什么。请改写/详细说明。

标签: c++ string c++11 embedded


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答,但更改原始消息过于复杂,因为涉及到其他公司。
  • @MoraruGabriel 您没有在消息中描述您需要什么类型的大小。您可以使用其他类似的实现来实现对更多类型/大小的支持,例如github.com/protobuf-c/protobuf-c,或者您可以自己扩展这些实现,如果您将更改作为拉取请求提出给他们,那么您可能会获得对更改的免费代码审查。 ;) 如果它涉及其他公司,那么当然要避免在其中入侵标准库或 std::string 之类的类。
猜你喜欢
  • 2014-04-22
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
相关资源
最近更新 更多