22

最初はこの単純なprotobufファイルがあります

message messagetest
{
    ...
    repeated float samples = 6;
    ....
}

このメソッドでヘッダーファイルを作成します

    //repeated float samples = 6;
      inline int samples_size() const;
      inline void clear_samples();
      static const int kSamplesFieldNumber = 6;
      inline float samples(int index) const;
      inline void set_samples(int index, float value);
      inline void add_samples(float value);
      inline const ::google::protobuf::RepeatedField< float >&  samples() const;
      inline ::google::protobuf::RepeatedField< float >* mutable_samples();

私が基本的に行っているのは、forループですべてのデータを1つずつコピーすることです。

int main(int argc, char** argv)
{    
    messagetest fMessage;
    
    vector<float> fData (1000, 0);

    // Create 1000 random values
    for (int i = 0; i < fData.size(); i++)
    {
        fData[i] = rand() % 1001;
    }
    
    for (int j = 0; j < fData.size(); j++)
    {
        fMessage.add_samples(fData[j]);    
    }

    return 0;
}

しかし、私はコピープロセスを加速するためにmemcpyのような方法を使用したいと思います。それは私の頭に浮かぶアイデアです。それが完全に間違っている場合は私を訂正してください。ヘッダーファイルの最後の宣言は次のとおりです。

inline ::google::protobuf::RepeatedField< float >* mutable_samples();

この方法が何をするのかわかりません(スキル不足)。しかし、それは一種のベクトルのように見えます。多分それは私の問題の解決策です。もしそうなら、私はそれを実装する方法がわかりません。

4

4 に答える 4

0

@mgildの答えは、RepeatedField(Iter begin, Iter end)コンストラクターを暗黙的に呼び出して、移動が割り当てられる一時的なものを作成します。一時的な RepeatedFieldを明示的に作成し、それを交換する@nazgul の回答と同じです。

はるかに簡単に、新しいオブジェクトの作成を回避するには、次のようにします。

fMessage.mutable_samples()->Add(fData.begin(), fData.end())

samplesフィールドがまだ空でない場合は、Clear前にメソッドを呼び出すことができます。

内部的には、これは( forward iteratorであるstd::copy限り) を使用するため、思いついた memcpy 実装と同じくらい高速になります。fData

于 2021-07-14T20:51:45.350 に答える