1

高パフォーマンスの C++ を実行する必要があるため、可能な限りデータのコピーを避ける必要があります。

したがって、文字列バッファーを zmq::message_t オブジェクトにコピーせずに直接割り当てたいと考えています。しかし、送信の成功を回避する文字列の割り当てが解除されているようです。

コードの一部は次のとおりです。

for (pair<int, string> msg : l) {
    comm_out.send_int(msg.first);
    comm_out.send_int(t_id);

    int size = msg.second.size();
    zmq::message_t m((void *) std::move(msg.second).data(), size, NULL, NULL);
    comm_out.send_frame_msg(m, false); // some zmq-wrapper class
}

メッセージが送信される前に文字列の割り当てが解除されないようにするにはどうすればよいですか? そして、文字列の割り当てが正確に解除されるのはいつですか?

よろしく

4

1 に答える 1

1

おそらく未定義の動作だと思いますzmq::message_t m((void *) std::move(msg.second).data()...が、確かに問題の原因です。この例でstd::moveは、あなたが思っていることをしていません。

への呼び出しstd::moveは、効果的に文字列の匿名一時を作成し、その内容をその中に移動してmsg.secondから、その一時データへのポインターをmessage_tコンストラクターに渡します。0MQ コードはポインタが有効であると仮定しますが、一時オブジェクトはコンストラクタのmessage_t完了後、つまり呼び出す前に破棄されますsend_frame

詳細については、0mq (0MQ ガイドを参照)ではゼロコピーは複雑な問題ですが、コピーされていないデータが有効であることを 0MQ が明示的に通知するまで有効にする必要があります。

この状況で C++ 文字列を使用するのは難しく、十分に検討する必要があります。「文字列の割り当てが解除されるのを回避する...」方法に関するあなたの質問は、問題の核心になります。それに対する唯一の答えは「細心の注意を払って」です。

要するに、本当にゼロコピーが必要ですか?

于 2013-08-06T10:17:02.360 に答える