子分配内存块

Suballocating memory block

本文关键字:内存 子分配      更新时间:2023-10-16

我正在使用一个网络API,该网络API将1个或多个消息列表返回我提供的缓冲区。返回时典型的缓冲区看起来像这样:

|B|message 1|S|message 2|S|message 3|E|

其中| b |是指示开始的角色,| s |是一个分离器,| e |是结局。消息的长度和数字可能不同。我想做的是遍历此缓冲区一次,然后将其分为(在这种情况下)3个组件消息,然后将类似std::unique_ptr<char*>的内容发送到将处理每个单独消息的代码,并让unique_ptr负责释放记忆。但是我想这样做,而不会将这些消息从缓冲区和较小的消息中复制出来。

我可以有效地使用一种技术,将缓冲区分配到新的较小的堆块中,并且仍然可以从自动清理中受益?

至少对于大多数分配机制的实现(即堆)。

作为一个简单的解决方案,我建议您使用共享指向整个缓冲区的指针,加上指针(或偏移)和发现消息的大小。

就是这样。

struct MsgPtr
{
    shared_ptr<Buffer> m_Buf;
    char* m_pMsg;
    size_t m_nMsgSize;
};

,如果您不打算将解析的消息保持长时间。