私は、ハードウェアデバイスから一連のint32を読み込み、大規模なデータ構造の一部としてint配列に格納してから、リモートTCP/IP上のシステム。だから、私は定義されたものの束を使って単純なデータ構造体を使用していましたが、今これをプロトコルバッファを使うように変換したいと思います。 私はproto buffの要素として "繰り返しint32データ"を使用することを考えていました。しかし、私はこのようなループを使用しないようにしたい:整数配列を送信するC++プロトコルバッファ
int hardware_data[1000]; // An array that holds the data read from the hardware
for(int i=0; i< sizeof(hardware_data); i++)
{
proto.add_data(hardware_data[i]);
}
Iいただきたいむしろちょうど[]配列(ゼロコピー方式)既存のhardware_dataを指し、このようなプロトバフを作るよう、効率的な方法を使用します、またはhardware_dataからproto.dataへのmemcpyを使用します。
私はmemcpy()を設定する方法を理解していますが、proto.dataの「配列」に含まれる要素の数はproto buffにどのように認識されますか? proto.data_size()を使用して要素数を取得できますか? ハードウェアの読み込みから送信するためにproto buffにデータを移動する効率的な方法はありますか? これを行うより良い方法はありますか?
Kerrik、 私はゼロコピーAPIを知らなかった。ここに私の原型の定義があります:
message hardware_data
{
optional Lob lob = 1;
optional int32 taskSeqNum = 2;
optional int32 secondsOfDay = 3;
optional float IQOutRateKhz = 4;
optional float IQBwKhz = 5;
optional int32 tStart = 6;
optional int32 tOffset = 7;
optional float collectionTime = 8;
optional int32 numSamples = 9;
optional int32 chunk = 10;
optional int32 dimSize = 11;
repeated int32 data = 12 [packed=true];
}
私はこのproto buffの定義にどのようにゼロコピーが再生されるのか分かりません。
[ゼロコピーAPI](https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.io.zero_copy_stream)のどの部分が不適切ですか? –
'sizeof'演算子は、データ構造体のサイズを* bytes *で返します。したがって、int型の1000項目の配列ではおそらく4000であり、ループは配列の実際の終わりをはるかに超えてしまい、未定義の動作を引き起こします。配列の項目数*を計算するには、 'sizeof(hadware_data)/ sizeof(hardware_data [0])'を使用します。 – CiaPan
もちろん....私はそれをサンプルコードとして配置しました。あなたのコメントは正しいものの、プロトコルバッファの使い方の質問には何も答えません。 – rbwilliams