【发布时间】:2019-01-21 18:30:06
【问题描述】:
为了在我的游戏中序列化组件,我需要能够访问各种向量中的数据,只要给定一个指针和向量的大小。
如果我只有一个指向向量的 void *,我想从向量中获取 data() 指针。我正在尝试从 std::vector<T> 转换为 std::vector<char> 以获取 data() 指针。我想知道下面的代码是否是定义的行为,并且在不同的情况下不会有任何不同。
#include <iostream>
#include <vector>
int main()
{
std::vector<int> ints = { 0, 1, 2, 3, 4 };
std::vector<char>* memory = reinterpret_cast<std::vector<char>*>(&ints);
int *intArray = reinterpret_cast<int *>(memory->data());
std::cout << intArray[0] << intArray[1] << intArray[2] << intArray[3] << intArray[4] << std::endl; //01234 Works on gcc and vc++
std::getchar();
}
这似乎在这种孤立的情况下有效,但我不知道它是否会在序列化代码中产生错误或未定义的行为。
【问题讨论】:
-
你为什么要通过
std::vector<char>?你不知道原来的类型? -
@Mat 关于向量唯一知道的是它的数据大小(以字节为单位)。
-
我把它扔到“可能有效,但违反严格别名,因此不能保证结果”bin。有没有机会对此进行模板化,以免丢失类型?换句话说,您的示例可能过于简单,以至于任何人都无法指出所有潜在问题。
-
为什么不只是
char* memory = reinterpret_cast<char*>(ints.data())?
标签: c++ visual-c++ language-lawyer stdvector undefined-behavior