我有一个代码,如下所示:
typedef struct{
uint8_t distance[2];
uint8_t reflectivity;
}data_point;
typedef struct{
uint8_t flag[2];
uint8_t Azimuth[2];
std::vector<data_point> points; // always size is 32 but not initialized whereas filled in run-time using emplace_back
}data_block;
typedef struct{
uint8_t UDP[42];
std::vector<data_block> data; // always size is 12 but not initialized whereas filled in run-time using emplace_back
uint8_t time_stamp[4];
uint8_t factory[2];
}data_packet;
static std::vector<data_packet> packets_from_current_frame;
假设packets_from_current_frame.size() = 26
,如何计算packets_from_current_frame
中的字节数?
我在纸上的解决方案:
1data_packet
(假设 32points
和 12data
(将有42+ (12*(2+2+32(3))) + 4 + 2 = 1248
。因此,结束地址是_begin + sizeof(uint8_t) * 26 * 1248
(_begin
是内存缓冲区的起始地址(。
通过这种计算,我总是丢失一些数据。丢失的字节数取决于packets_from_current_frame.size()
。计算有什么问题?
看看这段代码:
int main() {
static std::vector<data_packet> packets_from_current_frame;
std::cout << "sizeof data_point = " << (sizeof(data_point)) << std::endl;
std::cout << "sizeof data_block = " << (sizeof(data_block)) << std::endl;
std::cout << "sizeof data_packet = " << (sizeof(data_packet)) << std::endl;
return 0;
}
输出:
sizeof data_point = 3
sizeof data_block = 32
sizeof data_packet = 80
由此可以清楚地看出为什么您的计算失败。
您忘记了考虑向量本身、向量后的字段和填充等内容。
正确的计算方法是:
packets_from_current_frame.size() * (sizeof(data_packet) + data.size() * (sizeof(data_block) + points.size() * sizeof(data_point)))
注意:此字节量不会存储在一个连续的内存块中,因此不要尝试任何直接内存。
单个向量具有连续的数据。如果你想知道向量保存的数据的地址,请使用vector::d ata((