16

マルチスレッド環境で、ソケットからデータを受信するスレッドがあり、そのデータをメッセージング キューに送信したいと考えています。

たとえば、次のようなものです。

char buf[N];
size_t len = ::recv(buf, ...);
queue.send([buf,len] {
    //stuff
});

しかし、それbufは範囲外になるか、次の によって上書きされる可能性があるため、機能しません::recv()。今、私はそれを/ / whateverにコピーして、それを値で渡すことができます:stringstd::vector

char buf[N];
size_t len = ::recv(buf, ...);
std::string my_data(buf, len);
queue.send([my_data](){ /* stuff */ });

しかし、余分なコピーが発生していますよね?追加のオーバーヘッドなしで同じ機能を実現する方法はありますか?

4

1 に答える 1

21

はい、できます。規格によると(5.1.2p21):

ラムダ式が評価されると、コピーによってキャプチャされたエンティティが、結果のクロージャオブジェクトの対応する非静的データメンバーを直接初期化するために使用されます。(配列メンバーの場合、配列要素は添え字の昇順で直接初期化されます。)

これにより、ラムダがコピーによって配列をキャプチャできることが明確になります。

于 2013-03-15T02:30:08.967 に答える