我发现asio的buffer的引用语义使用起来不方便。它需要用户在堆中分配数据,但是对于小数据(例如,100 Byte),在堆栈上分配并复制几次(我认为使用 asio 时复制次数应该小于 3)会比调用一个新的操作。例如:
class MyData {
std::vector<char> data;
};
void hander(Request req) {
MyData d;
async_write(buffer(d.data)...);
} // oops, d was destroyed, but the actual write have not execute
// this is ok, but awkward and poor performance if data is very small
void hander(Request req) {
shared_ptr<MyData> d(new MyData());
async_write(buffer(d->data)...bind(&X::handle_write, this, d);
}
void handle_write(shared_ptr<MyData> s) {
}
为什么 asio 没有提供可以进行深拷贝的缓冲区?它将节省性能的复制时间,但对于应用程序发送大量小数据,性能应该更差
在其文档中,连接对象有一个用于保存数据的成员,但对于大多数应用程序来说,一个数据成员是不够的。当应用程序可以随时写入数据时需要使用队列(不喜欢 HTTP 等半双工协议),否则数据可能会被下一次写入覆盖。所以如果队列是Queue,那还需要调用new,如果队列是Queue,那还需要copy