起初,我有这个简单的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());
}