mbed MemoryPool - 它可以用于非平凡的类吗?

时间:2018-01-19 06:59:51

标签: c++ mbed

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

检查MemoryPool.h的来源似乎表明它只是采用内存块并按原样呈现(或者如果使用calloc则将块清零)并且不执行新的放置。我试图遵循实现,但在系统调用/弱链接迷宫中有点丢失。

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

我在Github上发了一个问题 - https://github.com/ARMmbed/mbed-os/issues/5891

迄今为止报道的内容强调了@Pharap在答案中所说的内容。

1 个答案:

答案 0 :(得分:2)

  

如果我发出分配请求,是否会调用对象构造函数?

似乎没有。

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

首先,正如您所提到的,调用memset(item, 0, sizeof(T));作为calloc中的代码确实违反了安全构造和破坏。

其次,将osMemoryPoolAlloc的结果强制转换为(T*)这一事实意味着它返回void *并且对它为其他大小分配内存的类型一无所知

  

我是否需要创建一个经过调整的MemoryPool来执行放置新操作(以及相应的析构函数调用)以获取正确初始化和构造的对象?

是的,你愿意。

但正如@Daniel Langr所提到的那样,可能存在协调问题。

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

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

我相信大多数arm设备都是32位的,所以我认为使用placement new创建一个对齐为4的类型可能是安全的(你可以用alignof查看。

但是,我的建议是在github页面上提出一个关于此的问题。 似乎代码没有充分记录,因此如果不仔细了解代码,就很难直接回答第二个问题。

(注意,如果返回的内存是合适的,那么你可以创建一个符合allocator规则的简单包装器模板类。这将允许使用支持allocator的容器,尽管它们会受到限制结果大小。)