c++ - 如何在 C++ 中将多个不同的值类型连续存储在同一个数组中?
问题描述
对于我正在构建的东西,我需要能够将运行时创建的结构存储在一个数组中,我还希望这些结构可以连续存储在内存中。有没有办法将一系列对象存储在数组中,而不知道它们在编译时将是什么对象?我会知道每个可能使用的对象及其大小。基本上,当我定义其中一个数组时,我将创建一个模板,其中包含将存储哪些对象以及以什么顺序存储的模板,之后它在数组的生命周期内不会改变,这意味着在运行时对象的步幅和位置将是已知。这可以通过分配诸如 std::byte 数组之类的东西,然后通过使用指针将它们的内存位置封装为所需类型来访问/初始化变量来完成吗?我知道这不是最干净的解决方案,但它可以工作吗?
澄清:这将用于由自定义脚本系统在运行时定义的 ECS 组件,因此必须使用连续内存和动态分配,我意识到我将需要创建类来处理这个问题,并且它会被改进,这就是它的乐趣。
解决方案
所以我想我找到了答案:
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,然后我可以将该索引转换为正确的类型,这就是我的值。
编辑:请参阅下面的评论以了解可能的改进。
推荐阅读
- reactjs - React MUIDatatables - 如何显示tableMeta rowData的名称
- android - 如何在颤动中创建一个弯曲的底部容器
- c# - 在 MVC 帖子中使用 ajax 得到 500 错误,在本地工作
- python - Pip 安装克隆的分叉存储库以供本地和生产使用
- sql - 将数千行插入包含其他表中的值的表中
- javascript - JavaScript If-else range check in 相反不起作用
- python - 初始化一个numpy数组以在其中保存其他数组?
- javascript - 如何修复 reactjs 中的历史推送?
- javascript - 提取字符串中负索引之前的所有内容
- pandas - Python - 如何查看 csv 文件的列名称