从根本上讲,I/O涉及在连续内存区域(叫做缓冲区)之间传递数据。这些缓冲区可以简单地被表示为一个由指针和字节数组成的元组。然而,为了允许开发高效率的网络应用,Boost.Asio为scatter-gather操作提供支持。这些操作涉及一个或多个缓冲区:
- 一个scatter-read接收数据到多个缓冲区。
- 一个gather-write传输多个缓冲区。
因此我们需要一个抽象来表达一组缓冲区。Boost.Asio使用的方法是定义一个类型(实际上是两个类型)来表示一个缓冲区。这些缓冲区可以被存储在一个容器中,容器可以被传递给scatter-gather操作。
除了将缓冲区设置为一个指针和字节数之外,Boost.Asio还在可修改内存和不可修改内存(后者被从一块const对象指向的内存创建)之间做了区别。因此,这两种类型定义如下:
typedef std::pair<void*, std::size_t> mutable_buffer;
typedef std::pair<const void*, std::size_t> const_buffer;
这里,一个可变的buffer可以被转换成一个const buffer,但反方向转换是无效的。
然而,Boost.Asio并不完全按上面那样定义,而是定义两个类:可变的buffer和const buffer。这些类的目标是提供一个连续内存的不透明表示,其中:
- 类型在转换中的行为类似于std::pair。也就是说,一个可变buffer被转换成一个const buffer,但反方向转换是不被允许的。
- 有防止缓冲区溢出的保护机制。给定一个缓冲区实例&#x