【发布时间】: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 究竟是什么未定义?我听不懂你在说什么。请改写/详细说明。