C++ C++;Protobuf添加已分配的重复数字字段

C++ C++;Protobuf添加已分配的重复数字字段,c++,protocol-buffers,smart-pointers,protobuf-c,C++,Protocol Buffers,Smart Pointers,Protobuf C,我有一条简单的消息,其中包含大量重复的数字字段: syntax=“proto3”; 选项cc_enable_arenas=true; 消息大数据{ 重复双信息=1; } 在运行时,数据到达并已分配。这就是我试图将其封装到消息中的方式(使用arena): void set_data(std::unique_ptr table,int size,bigData*消息){/*假设消息有效*/ 谷歌::protobuf::竞技场; google::protobuf::Arena::CreateArra

我有一条简单的消息,其中包含大量重复的数字字段:

syntax=“proto3”;
选项cc_enable_arenas=true;
消息大数据{
重复双信息=1;
}
在运行时,数据到达并已分配。这就是我试图将其封装到消息中的方式(使用arena):

void set_data(std::unique_ptr table,int size,bigData*消息){/*假设消息有效*/
谷歌::protobuf::竞技场;
google::protobuf::Arena::CreateArray(&Arena,大小);/*(0)*/
消息->清除信息();
对于(int i=0;imutable_info()->添加(表[i]);
}
}
  • 这是正确的用法吗
  • 有没有办法告诉竞技场,这个已经分配的数据属于已经初始化的消息
  • 有没有办法告诉竞技场我将在
    (0)
    分配的内存已经存在
  • 如何最大限度地减少不必要的数据分配/解除分配
已经回答了
std::vectors
(不回答
std::unique\u ptr
)。如果我们有
std::vector
而不是
std::unique\ptr表,则可以使用以下内容:

void set_data(std::vector table,bigData*message){/*假设消息有效*/
谷歌::protobuf::竞技场;
google::protobuf::Arena::CreateArray(&Arena,table.size());/*(0)*/
*bigData->mutable_info()={table.begin(),table.end()};
}
注意:这个括号内的初始化器列表需要C++11,但协议缓冲区也需要C++11

向量比原始数组更适合于用例

  • 尺寸信息可通过成员函数获得

当然也有例外,但一般来说,向量是更好的选择,而不是唯一的指针数组

关于竞技场相关问题:引用谷歌协议缓冲区API:

无效交换(其他消息):*

如果要交换的两条消息不在竞技场上或在同一竞技场上 竞技场,Swap()的行为与没有竞技场分配的情况相同 已启用:它通常有效地交换消息对象的内容 通过廉价的指针交换和不惜一切代价避免拷贝

但是,如果竞技场上只有一条消息,或者消息打开 不同的领域,Swap()执行基础数据的深度拷贝。 这种新行为是必要的,因为否则交换的子对象可能会丢失 具有不同的生命周期,可能导致在释放bug后使用

因此,也可以通过以下方式在同一竞技场中创建repeatedfield:

void set_data(std::vector table,bigData*message){/*假设消息有效*/
谷歌::protobuf::竞技场;
google::protobuf::RepeatedField新建_字段(table.begin(),table.end());
*net->mutable_info()->交换(&new_字段);
}
虽然如果
消息
不在同一区域(如上所述),深度复制 无法避免。我想补充一点,在这个例子中,竞技场 在功能范围内。尽管如此,竞技场最好是属于哪个地方 内存被分配的最多,在这种情况下,它将位于函数作用域之上的某个位置