gpt4 book ai didi

c++ - 在字节数组上转换具有虚函数的结构是否安全?

转载 作者:行者123 更新时间:2023-11-30 01:08:03 25 4
gpt4 key购买 nike

比如我有一个结构定义

struct Data { 
uint8_t data1;
uint16_t data2;
virtual uint8_t getData1() { return data1; }
virtual uint16_t getData2() { return data2; }
}

我有一个字节数组

uint8_t data[3];

这样做安全吗:

Data *d = (Data*)data;

我问是因为,我读到一个带有虚函数存储的类一个虚拟表指针,没有标准定义它在哪里存储在对象中。另外,例如,如果我继承自 Data

struct Data2 : Data { uint8_t data3; 
virtual uint8_t getData3() { return data3; } }

Data2对象中成员变量的顺序可以是什么存储?如果我将 Data2 结构转换到一个字节数组上,它会在数据1、数据2、数据3的顺序?提前谢谢你。

最佳答案

在 C++ 中,一个 c style cast被解释为等效的 c++ 转换,仍然可以完成转换的最严格限制。在这种情况下,它是 reinterpret_cast .

关于reinterpret_cast 的文档列举了每个定义的用例。不幸的是,您的案例被禁止取消引用结果指针。虚方法的存在与此无关。

请注意,为了检查其表示,将 Data * 转换为 uint8_t * 是合法的。将这样的 uint8_t* 转换回 Data* 也是合法的。

编辑:如果您的目标是为Data 实例提供存储空间,您可以使用std::aligned_storage。和 placement new . std::aligned_storage 提供了一个安全的内存位置,可以在其中构造类型的实例,放置 new 允许您指定构造实例的位置。但是,如果您打算存储派生类型,这将无法正常工作。

关于c++ - 在字节数组上转换具有虚函数的结构是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43399881/

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