asio のバッファの参照セマンティックが使いにくいことがわかりました。ユーザーはデータをヒープに割り当てる必要がありますが、小さなサイズのデータ(たとえば100バイト)の場合、スタックに割り当てて数回コピーします(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 の場合はコピーする必要があります