首页 > 解决方案 > 是否可以在 C++ 中使用零拷贝拼接缓冲区?

问题描述

假设我有两个缓冲区:

uint8_t* buf1[100];
uint8_t* buf2[10];
uint8_t* buf3[90];

哪里buf1充满了数据,我需要将 10 个字节的数据传递buf2buf3. 有没有办法在不复制的情况下做到这一点?

如果没有,是否有一个高级库(如std::vector)可以在不复制的情况下进行拼接?

标签: c++

解决方案


不,这是不可能的。这三个缓冲区是具有不同地址的不同对象。因此,某种形式的复制是必要的。

您可以使用span

span<uint8_t*, 10> buf2(buf1, 10);
span<uint8_t*, 90> buf3(buf1 + 10, 90);

span从 C++17 开始不在标准库中,但在 GSL 中可用。请参阅什么是“跨度”以及何时应该使用“跨度”?.


推荐阅读