客户内存分配
许多异步操作都需要分配一个对象来保存当前操作的状态。比如,在Win32平台上,需要一个OVERLAPPED的子类对象来适配Win32 API。
与此同时,程序拥有简要标记的异步操作链。一个半双工的网络协议(比如HTTP服务器),每个客户端都有一条操作链。而全双工的协议则拥有两条平行的执行链。程序应该利用这些知识来减少异步操作的内存消耗。
给出一个用户定义的回调对象h,如果操作需要分配相应回调对象的内存,会写出如下代码:
void* pointer = asio_handler_allocate(size, &h);
相应的,释放内存:
asio_handler_deallocate(pointer, size, &h);
这些函数是基于ADL(译者注:参数决定查找顺序,wiki: https://en.wikipedia.org/wiki/Argument-dependent_name_lookup)实现的。这些函数在asio中有默认的实现:
void asio_handler_allocate(size_t, ...);
void asio_handler_deallocate(void*, size_t, ...);
这些函数替代了new和delete操作符。
这种实现保证了在调用回调函数之前(译者注:此处的意思是将回调对象的附带状态释放掉,回调函数依然存在于函数表中),会释放内存以供新的异步操作使用。
参见
asio_handler_allocate, asio_handler_deallocate, custom memory allocation example (C++03), custom memory allocation example (C++11)