我有一个需要使用的带有灵活数组成员的结构。
struct Record
{
uint32_t length;
Data contents[];
};
我可以通过执行以下操作来初始化它并使用它:(它也适用于 malloc 或任何其他动态分配)
vector<Data> members;
vector<uint8_t> buffer;
Record myRecord;
buffer.resize(sizeof(Record) + members.size() * sizeof(Data));
myRecord = *(reinterpret_cast<Record*>(buffer.data());
myRecord.length = static_cast<uint32_t>(members.size());
// copy members to myRecord.contents
这工作得很好。但是现在我需要一个对批量记录进行操作的接口,并且我一直在尝试为此使用 std::vector。然后问题开始出现,我猜这是因为 std::vector 将所有元素连续排列在内存上,并且由于 sizeof(Record) 不会考虑内容的大小(每个向量元素将只包含 4 个字节,而不是 4 字节 + size_of_contents * sizeof(Data)),向量元素实际上是共享内存,然后每个元素开始覆盖前一个元素的内容。那有意义吗?
如果这确实是问题所在,我想知道是否有任何方法可以“强制”向量为每个元素分配特定的大小(而不是 sizeof 返回元素类型的任何大小)。这样我可以确保每个向量元素都有足够的大小。如果这不可能,是否有替代解决方案?也许一个不同的容器可以让我这样做?请记住,我确实需要使用定义的结构(我很想将整个东西替换为向量,但不幸的是这是不可能的)