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 的规则。这将允许与启用分配器的容器一起使用,尽管它们的尺寸会因此受到限制。)
我正在考虑使用 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 的规则。这将允许与启用分配器的容器一起使用,尽管它们的尺寸会因此受到限制。)