- 主题:两个BytesMut能够零拷贝合并吗
一个的头连在另一个的尾,形成一个bytesmut
--
FROM 221.218.141.*
零拷贝什么意思?
BytesMut有extend_from_slice方法
【 在 AlphaO 的大作中提到: 】
: 一个的头连在另一个的尾,形成一个bytesmut
--
FROM 114.92.200.*
extend_from_slice内部会执行memcpy,将新增的[u8]完全复制过来,花费时间和[u8]的长度有关,越久越慢
零拷贝就是不用值拷贝,只让它们从逻辑上变成一个整体,而不涉及到allocation,不用对数组进行copy
【 在 RunningOn 的大作中提到: 】
: 零拷贝什么意思?
: BytesMut有extend_from_slice方法
:
--
FROM 221.218.141.*
那不行。
bytes, Bytes, BytesMut 都是一个连续的内存区域。
两个BytesMut, 一定是在两个不同的内存区域里。
【 在 AlphaO 的大作中提到: 】
: extend_from_slice内部会执行memcpy,将新增的[u8]完全复制过来,花费时间和[u8]的长度有关,越久越慢
: 零拷贝就是不用值拷贝,只让它们从逻辑上变成一个整体,而不涉及到allocation,不用对数组进行copy
--
FROM 114.92.200.*
还是有点困惑
vec<t>,当t不可copy及clone时,也可以用extend扩展,这里面实现过程,会重新allocation吗?
或者再提炼一下问题,如何将两个vec<t>用最高效率合并为一个vec
【 在 RunningOn 的大作中提到: 】
: 那不行。
bytes, Bytes, BytesMut 都是一个连续的内存区域。
两个BytesMut, 一定是在两个不...
--
FROM 114.254.9.*
Bytes是连续内存区域,vec并不是呀。
vec<T>,vec首先会有一块连续内存区域保存T数据的“指针”,T可能还有成员变量是在其它地方。
比如 let v: vec<String> = vec!["123", "asbda"]; 那么v会申请一片连续区域,能保存下2个String的“指针”,这2个String指针会分别指向字符串的真实地址(以及内存大小)。而字符串"123"和"asbda"则不一定在一片连续内存区域里。
v1.extend(v2)只需要把v2里的数据指针复制过去就行了,用rust语言就是把v2的所有权转移到v1,之后v2就不能用了。
合并用extend应该是最高效的了,还有append之类的方法都差不离。但它们都不是你之前说
的“零拷贝”,因为还是要复制“指针”的。
【 在 AlphaO 的大作中提到: 】
: 还是有点困惑
: vec<t>,当t不可copy及clone时,也可以用extend扩展,这里面实现过程,会重新allocation吗?
: 或者再提炼一下问题,如何将两个vec<t>用最高效率合并为一个vec
: ...................
--
FROM 114.92.200.*
豁然开朗,大赞
【 在 RunningOn 的大作中提到: 】
: Bytes是连续内存区域,vec并不是呀。
vec,vec首先会有一块连续内存区域保存T数据的“指针”,T可能还有成员变...
--
FROM 114.254.9.*