mbed MemoryPool - 它可用于重要的 类 吗?

mbed MemoryPool - is it usable for nontrivial classes?

我正在考虑使用 mbed 的 MemoryPool API,但它似乎是面向简单的 POD 类型的。

检查 MemoryPool.h 的来源似乎表明它只是获取内存块并按原样呈现(或者如果使用 calloc 则将块归零)而不是进行新的放置。我试图按照实现进行操作,但在 syscall/weak-link 迷宫中有点迷路。

我的问题:这个 MemoryPool 实现是否可用于重要的 C++ 类?也就是说,如果我提出分配请求,是否会调用对象构造函数?或者我是否需要创建一个适配的 MemoryPool 来执行放置新操作(以及相应的析构函数调用)以获得正确初始化和构造的对象?

我已经在 Github - https://github.com/ARMmbed/mbed-os/issues/5891

打开了一个问题

到目前为止所报道的内容强化了@Pharap 在他们的回答中所说的内容。

if I make an allocation request, will the object constructor be called?

好像不是。

虽然我找不到 osMemoryPoolAlloc 函数的源代码,但还有一些其他的赠品。

首先如您所说,calloc中的代码调用memset(item, 0, sizeof(T));确实违反了安全构造和销毁。

其次,osMemoryPoolAlloc 的结果被转换为 (T*) 这一事实意味着它 returns 一个 void * 并且对它分配内存的类型一无所知除了它的大小。

do I need to create an adapted MemoryPool to perform placement new operations (and the corresponding destructor calls) in order to obtain properly initialized and constructed objects?

是的,你会的。

但是正如@Daniel Langr 提到的那样,可能会涉及对齐问题。

对于它的价值,代码底部有一条评论:

/* osMemoryPoolNew requires that pool block size is a multiple of 4 bytes. */

而且我相信大多数 arm 设备都是 32 位的,所以我认为使用 placement new 来创建对齐方式为 4 的类型可能是安全的(您可以使用 alignof.

不过,我的建议是在 github 页面上提出有关此问题的问题。 似乎代码没有足够的文档记录,所以如果不深入了解代码,就很难直接回答你的第二个问题。


(请注意,如果返回的内存适当对齐,那么您可以创建一个简单的包装器模板 class,它遵守 allocator 的规则。这将允许与启用分配器的容器一起使用,尽管它们的尺寸会因此受到限制。)