首页 > 解决方案 > 如何在 C++ 中将多个不同的值类型连续存储在同一个数组中?

问题描述

对于我正在构建的东西,我需要能够将运行时创建的结构存储在一个数组中,我还希望这些结构可以连续存储在内存中。有没有办法将一系列对象存储在数组中,而不知道它们在编译时将是什么对象?我会知道每个可能使用的对象及其大小。基本上,当我定义其中一个数组时,我将创建一个模板,其中包含将存储哪些对象以及以什么顺序存储的模板,之后它在数组的生命周期内不会改变,这意味着在运行时对象的步幅和位置将是已知。这可以通过分配诸如 std::byte 数组之类的东西,然后通过使用指针将它们的内存位置封装为所需类型来访问/初始化变量来完成吗?我知道这不是最干净的解决方案,但它可以工作吗?

澄清:这将用于由自定义脚本系统在运行时定义的 ECS 组件,因此必须使用连续内存和动态分配,我意识到我将需要创建类来处理这个问题,并且它会被改进,这就是它的乐趣。

标签: c++arraysbytedynamic-memory-allocationdata-driven

解决方案


所以我想我找到了答案:

std::vector<std::byte> bytes;
void addFloat(float value)
{
    size_t index = bytes.size();
    bytes.resize(bytes.size() + sizeof(float), std::byte(0));
    *(float*)(&bytes[index]) = value;
}
float readFloat(size_t index) const 
{
    return *(float*)(&bytes[index]);
}

这可以从向量中读取和写入浮点数(经过测试),并且我假设它适用于我为其创建函数的任何值类型。所以现在我需要做的就是编写一个处理多种值类型的类。创建类后,我将计算虚拟浮点数的大小并将其存储,然后我可以使用该值按索引查找浮点数。然后要检索该结构值的一个组件,我将有另一个列表存储每个变量相对于结构索引 0 的偏移量。所以 index + offset[variable index] = index of variable,然后我可以将该索引转换为正确的类型,这就是我的值。

编辑:请参阅下面的评论以了解可能的改进。


推荐阅读