我几乎被一个我从未得到答案的问题所困扰,这个问题解决了一个极其重要的问题;boost::asio 的内存碎片。
在文档中也没有在 SO 中找到任何东西。
boost::asio 的异步函数,例如 async_write() 和 async_read_some()总是分配一些东西。(在我的情况下,分别是 144 和 96 字节,在 VC9 调试版本中)。
我怎么知道呢?
我将客户端连接到该库提供的“回声服务器”示例。
我在“operator new(size_t size)”的代码中的“new.cpp”处设置了一个断点。
然后我发送“123”。断点被击中!
现在使用堆栈跟踪,我可以清楚地看到“新”调用的根来自我在函数处理程序中进行的 async_write() 和 async_read_some() 调用。
所以内存碎片迟早会出现,因此我不能使用ASIO,但我希望我可以!
我想指出,我了解异步操作至少在 IOCP 需要在操作期间使用分配的结构,直到完成(调用处理程序时)。
例如,对于 IOCP,每个操作(读/写)都必须有一个 OVERLAPPED 结构。
我怀疑这就是我有上述小分配的原因,谁让我担心内存碎片。
那我该如何汇集这些结构呢?当然是平台无关的。
任何的想法?任何有用的代码示例?我相信你们中的一些人已经解决了这个问题。