我正在研究使用mbed的MemoryPool API,但它似乎面向简单的POD类型。
检查MemoryPool.h的来源似乎表明它只是采用内存块并按原样呈现(或者如果使用calloc则将块清零)并且不执行新的放置。我试图遵循实现,但在系统调用/弱链接迷宫中有点丢失。
我的问题:这个MemoryPool实现是否可用于非平凡的C ++类?也就是说,如果我发出分配请求,是否会调用对象构造函数?或者我是否需要创建一个经过调整的MemoryPool来执行放置新操作(以及相应的析构函数调用)以获取正确初始化和构造的对象?
我在Github上发了一个问题 - https://github.com/ARMmbed/mbed-os/issues/5891
迄今为止报道的内容强调了@Pharap在答案中所说的内容。
答案 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的容器,尽管它们会受到限制结果大小。)