矢量从memcpy的protobuf的复制一个std ::到重复场(Copy a std::vect

2019-08-17 17:47发布

起初,我有这个简单的protobuf文件

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

它创建这个方法headerfile

    //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();

我正在做的基本上是由一个一个复制的循环中的所有数据之一。

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加快复制过程。 这仅仅是在我脑海中的想法。 如果这是完全错误的指正。 在headerfile最后的声明是:

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

我不知道这是什么方法呢(缺乏技能)。 但它看起来像一个载体。 也许这就是我的问题的解决方案。 如果是这样,我不知道如何实现它。


编辑解决

memcpy的是在任何情况下更快,因为你有一个方法调用,然后复制数据。 相比for循环具有调用“fMessage.add_samples()”方法1000倍。

这种方法的一个缺点是,你必须知道你的向量的大小来保留数据的样本,但你可以分配在PROGRAMM启动fMessage.sample内存(这对我的作品)。

fMessage.mutable_samples()->Reserve(fData.size());

for (int j = 0; j < fData.size(); j++)
{
   fMessage.add_samples(0);          
}

现在我可以从一个while循环流获取数据,并用的memcpy将它们复制到我的datastructer

while(42)
{
   //fancy streaming things to get vector fData

  memcpy(fMessage.mutable_samples()->mutable_data(),
         &fData[0],
         sizeof(float)*fData.size());
}

Answer 1:

因为这还没有实现,我喜欢的俏皮话:

*fMessage.mutable_samples() = {fData.begin(), fData.end()};


Answer 2:

我发现矢量复制到重复场,因为这最短的方法:

google::protobuf::RepeatedField<float> data(fData.begin(), fData.end());
fMessage.mutable_samples()->Swap(&data);

这大概也是比你更快,因为它避免了初始迭代和设定值设置为0



文章来源: Copy a std::vector to a repeated field from protobuf with memcpy