使用 std::vector<char> 作为异构记录的存储是否安全?
Is it safe to use std::vector<char> as storage for heterogeneous records?
我需要处理由一系列 POD 元素组成的记录。 在处理一系列这些记录之前,会在运行时找到这些元素的类型。理想情况下,记录的存储将连续保存元素,以便可以直接填充存储或使用系统 IO 调用输出存储。
给定以下简化的示例代码:
template<typename T>
struct ElementAccessor {
ElementAccessor(int offset)
:
_offset(offset)
{}
T &operator () (void * data)
{
return reinterpret_cast<T &>(
*reinterpret_cast<char *>(data) + _offset);
}
int _offset;
};
ElementAccessor<float> fEl(0);
ElementAccessor<int> iEl(sizeof(float));
我正在寻找一种有效且方便的方法来存储记录?
我考虑了以下方法:
vector<int>
使用vector<int>
似乎很方便:
std::vector<int> intData(2);
iEl(intData.data()) = 42;
fEl(intData.data()) = 12.4f; //< Uh-oh, undefined behaviour, maybe zero initialization could be reordered after this point!
但会违反严格别名规则。
Raw allocated memory
我相信以下是有效的代码,但由于内存管理是手动的,因此不方便:
void *voidData(operator new(2 * sizeof(int)));
iEl(voidData) = 42;
fEl(voidData) = 12.4f;
...
operator delete(voidData);
std::vector<char>
如何使用std::vector<char>
:
std::vector<char> charData(2 * sizeof(int));
iEl(charData.data()) = 42;
fEl(charData.data()) = 12.4f;
这很方便,因为std::vector
很好地处理了内存管理。 但它有效吗?
根据标准,您提出的选项都不正确,因为违反了严格别名和对齐。
您可以做的是在缓冲区的任意偏移量和您选择的类型之间memcpy
。 但没有对"就地"的数据进行操作。
相关文章:
- 将字符串存储在c++中的稳定内存中
- std::原子加载和存储都需要吗
- C++:将控制台输出存储在宏中更好吗
- 将两个数组中的差异记录在第三个数组中
- 使用QProcess执行命令,并将结果存储在QStringList中
- 访问存储在向量C++中的结构的多态成员
- 如何从存储在std::映射中的std::集中删除元素
- 存储模板类型以强制转换回派生<T>
- 类型总是使用其大小存储在内存中吗
- 当字符串存储在变量中时,如何将字符串转换为wchar_t
- 使用无符号字符数组有效存储内存
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 带结构的二维矢量:如何存储元素
- 使用 std::vector<char> 作为异构记录的存储是否安全?
- 在OSX中使用CGDisplayStream存储屏幕记录的特定文件路径
- 如何更改C 文件中存储的特定记录的特定实体
- 如何访问存储在文件中的用户记录(没有数据库)
- 存储一个段落并记录每个单词的出现次数
- 记录器在崩溃后没有将记录的信息存储到文件中