为何Hyper库未为Vec实现hyper::body::Buf trait?
为什么Hyper库不为Vec实现
hyper::body::Buf trait? Hyper里的Buf trait实际复用了bytes库的Buf,之所以不给Vec做实现,核心原因有这几点:
没必要重复造轮子:Vec本身可以直接通过
&vec[..]转换成&[u8],而&[u8]已经有现成的Buf实现。直接用切片就能满足所有Buf的使用场景,单独给Vec加实现属于冗余。语义和场景适配:bytes库提供的
Bytes类型才是为网络IO场景优化的缓冲区——支持零拷贝、共享所有权、高效分片这些特性,Hyper更推荐用它来处理请求/响应体。Vec是标准库的通用可增长容器,和Bytes的定位不同,如果给Vec加Buf实现,反而容易让用户混淆两者的适用场景。所有权逻辑的考量:
Buf的核心是消费式读取(通过advance方法移动读取位置),如果给Vec直接实现Buf,要么得额外维护一个读取偏移量(像切片的实现那样),要么就得修改Vec本身的内容,前者没必要,后者不符合Vec的使用习惯。用切片或者Bytes来做Buf,在所有权和性能上都更合理。
另外,VecDeque因为内存布局是非连续的,没法直接转换成连续切片,所以必须专门实现Buf来处理非连续的读取逻辑,这和Vec的情况完全不同。
内容的提问来源于stack exchange,提问作者mr.celo
相关产品推荐
相关产品推荐

