gpt4 book ai didi

c++ - 使用 std::vector 作为异构记录的存储是否安全?

转载 作者:行者123 更新时间:2023-11-30 05:00:23 25 4
gpt4 key购买 nike

我需要处理由一系列 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::vector<char> 作为异构记录的存储是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50827096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com