我正在研究使用mbed的MemoryPool API,但是它似乎面向简单的POD类型。
检查MemoryPool.h的来源似乎表明它只是占用内存块并按原样显示(如果使用calloc,则将其清零),而不进行新的放置。我尝试遵循该实现,但是在syscall /弱链接迷宫中有些迷路。
我的问题:此MemoryPool实现可用于非平凡的C++类吗?也就是说,如果我发出分配请求,是否将调用对象构造函数?还是我需要创建一个适应的MemoryPool来执行放置新操作(以及相应的析构函数调用),以便获得正确初始化和构造的对象?
我在Github上发布了一个问题-https://github.com/ARMmbed/mbed-os/issues/5891
到目前为止,已有报道证实了@Pharap在回答中所说的话。
最佳答案
似乎没有。
尽管我找不到osMemoryPoolAlloc
函数的源代码,但还有其他一些赠品。
首先,正如您提到的,像memset(item, 0, sizeof(T));
中的代码那样调用calloc
确实确实违反了安全构造和销毁方法。
其次,osMemoryPoolAlloc
的结果被强制转换为(T*)
的事实意味着它返回了void *
,除了其大小以外,对其分配内存的类型一无所知。
是的,你会的。
但是,正如@Daniel Langr提到的那样,可能会涉及对齐问题。
对于值得的是,在代码底部有一条注释,指出:/* osMemoryPoolNew requires that pool block size is a multiple of 4 bytes. */
而且我相信大多数 ARM 设备都是32位的,因此我认为使用new放置创建对齐方式为4的类型(可以使用 alignof
进行检查)可能是安全的。
但是,我的建议是在github页面上提出有关此问题。
该代码似乎没有足够的文档记录,因此,如果没有对代码的充分了解,很难直接回答您的第二个问题。
(请注意,如果返回的内存适合对齐,则可以创建一个简单的包装模板类,该类遵循allocator的规则。这将允许与启用分配器的容器一起使用,尽管这样会限制它们的大小。)
关于c++ - mbed MemoryPool-可用于非平凡的类吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48335691/