指向 pool-allocated 内存中数组的共享指针
Shared pointer to array in pool-allocated memory
我正在编写 fixed-capacity、copy-on-write“字符串”class,它能够使用分配器进行内存分配。最终,我希望能够让这些“字符串”使用 returns fixed-sized 内存块的内存池。如果正在创建的字符串的“容量”小于池块大小,那么额外的内存就被“浪费了”。如果容量更大,这是断言失败(即,您不能创建大于池块大小的字符串)。
为了实现 copy-on-write 行为,我正在尝试弄清楚如何使用此池在该内存块中创建指向数组的共享指针。我不能只使用 std::shared_ptr(pool.allocate(...)) 因为我需要在池分配的相同内存块中分配控制块和内存。
从视觉上看,内存应该是这样的:
----------------------------------------------------
| Memory Pool Chunk |
|--------------------------------------------------|
| Control Block | Array of characters ... | UNUSED |
----------------------------------------------------
根据我的研究,我可以看到这是 std::make_shared 所做的示例;它在连续的内存块中分配控制块和 object 。但是,看起来您也无法使用 std::make_shared 分配 arbitrarily-sized 数组。你可以用它来分配 std::array objects,但是你当然需要在编译时知道大小,而我要分配的数组的大小在 run-time 是已知的。
我的下一个想法是简单地实现我自己的、精简的共享指针。由于我不需要弱指针或自定义删除器,这似乎我应该能够将分配器和引用计数存储在从池中返回的内存中的某种“header”中。然后,剩余的内存可以用于数组。
但是,我无法弄清楚您应该如何在 header 中存储分配,然后使用分配器进行数据的深层复制。
有人可以帮忙吗:
a) 指导我使用已有的 build-in 标准库结构或
b) 帮我想办法实现我自己的符合上述要求的共享指针
我会避免为此使用 shared_ptr
。不仅因为您需要 C++20 才能让 allocate_shared
在数组上工作,还因为它对于您的嵌入式需求来说效率低下。
shared_ptr
控制块有两个引用计数以允许弱指针。您的特定用例不需要弱指针,因此您只需要一个计数。控制块有一个指向它管理的对象的指针。在您的用例中,数组始终位于控制块之后。控制块有一个分配器的副本,但是你的字符串 class 已经有了,所以它不需要在控制块中。等等。
您应该使用手卷解决方案,以便可以最大限度地减少簿记内存量,从而最大化您获得的实际字符串存储量。
我正在编写 fixed-capacity、copy-on-write“字符串”class,它能够使用分配器进行内存分配。最终,我希望能够让这些“字符串”使用 returns fixed-sized 内存块的内存池。如果正在创建的字符串的“容量”小于池块大小,那么额外的内存就被“浪费了”。如果容量更大,这是断言失败(即,您不能创建大于池块大小的字符串)。
为了实现 copy-on-write 行为,我正在尝试弄清楚如何使用此池在该内存块中创建指向数组的共享指针。我不能只使用 std::shared_ptr(pool.allocate(...)) 因为我需要在池分配的相同内存块中分配控制块和内存。
从视觉上看,内存应该是这样的:
----------------------------------------------------
| Memory Pool Chunk |
|--------------------------------------------------|
| Control Block | Array of characters ... | UNUSED |
----------------------------------------------------
根据我的研究,我可以看到这是 std::make_shared 所做的示例;它在连续的内存块中分配控制块和 object 。但是,看起来您也无法使用 std::make_shared 分配 arbitrarily-sized 数组。你可以用它来分配 std::array objects,但是你当然需要在编译时知道大小,而我要分配的数组的大小在 run-time 是已知的。
我的下一个想法是简单地实现我自己的、精简的共享指针。由于我不需要弱指针或自定义删除器,这似乎我应该能够将分配器和引用计数存储在从池中返回的内存中的某种“header”中。然后,剩余的内存可以用于数组。
但是,我无法弄清楚您应该如何在 header 中存储分配,然后使用分配器进行数据的深层复制。
有人可以帮忙吗:
a) 指导我使用已有的 build-in 标准库结构或
b) 帮我想办法实现我自己的符合上述要求的共享指针
我会避免为此使用 shared_ptr
。不仅因为您需要 C++20 才能让 allocate_shared
在数组上工作,还因为它对于您的嵌入式需求来说效率低下。
shared_ptr
控制块有两个引用计数以允许弱指针。您的特定用例不需要弱指针,因此您只需要一个计数。控制块有一个指向它管理的对象的指针。在您的用例中,数组始终位于控制块之后。控制块有一个分配器的副本,但是你的字符串 class 已经有了,所以它不需要在控制块中。等等。
您应该使用手卷解决方案,以便可以最大限度地减少簿记内存量,从而最大化您获得的实际字符串存储量。