如何以C++为单位计算向量中的字节数?



我有一个代码,如下所示:

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((

最新更新