C++协议缓冲区,发送整数数组
C++ Protocol Buffer, sending integer array
我有一个嵌入式C++项目,我从硬件设备读取一系列int32,然后将它们打包到一个int数组中作为大数据结构的一部分,然后通过TCP/IP发送到远程系统。所以,我使用了一个简单的数据结构,定义了一堆东西,现在我想将其转换为使用协议缓冲区。所以,我考虑使用"重复的int32数据"作为我的原型buff的元素。但我想避免使用这样的循环:
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] );
}
我宁愿使用一种有效的方法,例如使proto buff仅指向现有的hardware_data[]数组(零复制方法),或者使用从hardware_data到proto.data的memcpy。
我了解如何设置 memcpy(),但是原型爱好者如何知道 proto.data "数组"中有多少元素?我还能使用 proto.data_size() 来获取元素的数量吗?有没有一种有效的方法将数据从我的硬件读取移动到原型buff进行发送?有没有更好的方法可以做到这一点?
克里克,我不知道零拷贝 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];
}
我不确定零副本将如何在这个原型buff定义中发挥作用。
在网络上,一个打包的重复 int32 被编码为一系列变量。变体是一种可变宽度编码,其中较小的值占用更少的空间。当然,这不是数据在数组中的表示方式,因此将其嵌入到消息零拷贝中实际上是不可能的。
但事实上,您目前正在制作两个副本,您可以消除其中一个。考虑将数据直接粘贴到google::protobuf::RepeatedField<int>
中,而不是直接分配int hardware_data[1000]
。然后,您可以巧妙地利用Swap()
将数据移动到没有副本的消息中:
RepeatedField<int> hardware_data;
hardware_data.Reserve(expected_size);
get_data_somehow(&hardware_data);
// later
proto.mutable_data()->Swap(&hardware_data);
序列化消息后,您可能希望另外 Swap() 返回该字段,以便可以重用已保留的内存。(RepeatedField::Clear()
不会释放底层内存,只需将其标记为重用即可。
综上所述,序列化消息仍然需要复制数据作为编码的一部分。即使您将编码更改为打包的重复 fixed32(实际上在线上编码为 32 位整数),也无法说服库直接使用您的内存。
- 从二进制文件中读取整数数组
- 新的整数数组向右移动?
- C++ 中的二维整数数组,每行中的元素数量不均匀
- 给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
- 为什么在我的 main 函数中声明整数后我的整数数组中会出现错误?
- 在 C++ 中将整数数组转换为位集表示形式的最佳方法?
- 从两个 4x64 位整数数组中获取取模
- 字符到整数数组
- 从函数参数 [C++] 复制整数数组
- 指向整数数组和打印总和的指针
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 线程安全整数数组?
- 整数数组中最长的回文
- 在大整数数组中查找子数组
- 查找整数数组中最接近的数字
- 创建<int>对整数数组指针的矢量引用 (C++)
- 整数指针数组的元素是否可以指向整数数组?
- 如何将整数数组相乘得到一个数字?
- 当 map 是一个整数数组并且由 operator[] 创建时,它是否初始化其映射类型
- 将文本文件读入整数数组