gpt4 book ai didi

c++ - mbed MemoryPool - 它可用于非平凡类吗?

转载 作者:搜寻专家 更新时间:2023-10-31 02:07:40 24 4
gpt4 key购买 nike

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

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

我的问题:这个 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 函数的源代码,但还有一些其他的赠品。

首先,正如您提到的,调用 memset(item, 0, sizeof(T)); 就像代码在 calloc 中所做的那样确实违反了安全构造和销毁。

其次,osMemoryPoolAlloc 的结果被转换为 (T*) 意味着它返回一个 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 提到的,可能会涉及对齐问题。

对于它的值(value),在代码底部有一条评论说:

/* osMemoryPoolNew 要求池 block 大小是 4 字节的倍数。 */

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

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


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

关于c++ - mbed MemoryPool - 它可用于非平凡类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48335691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com