gpt4 book ai didi

c++ - vector 之间的转换是否定义了行为?

转载 作者:太空宇宙 更新时间:2023-11-04 12:40:52 25 4
gpt4 key购买 nike

为了在我的游戏中序列化组件,我需要能够访问各种 vector 中的数据,只需给定一个指针和 vector 的大小。

如果我只有一个 void * 指向 vector ,我想从 vector 中获取 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>* memory = reinterpret_cast<std::vector<char>*>(&ints);
int *intArray = reinterpret_cast<int *>(memory->data());

根据 [basic.life],访问 memory->data() 这里有未定义的行为。

解决此问题的方法是调用 ints.data() 以获得指向底层连续数组的 int* 指针。之后,您可以将其转换为 void*char*unsigned char*(或 std::byte* 在 C++17 中)。

从那里您可以转换回 int* 以再次访问元素。

关于c++ - vector 之间的转换是否定义了行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54295888/

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