可以安全地将数组映射到C++;班 < >我想把数据从数组映射到C++类。该类将只有私有成员变量,没有继承或虚拟内容。是安全的还是应该使用C++中的结构?< /p> void main(void) { uint8_t data[50]; MyClass *msg; msg = nullptr; for (int i = 0; i < 50; i++) { data[i] = i; } msg = (MyClass *) &data[0]; cout << msg->name(); }

可以安全地将数组映射到C++;班 < >我想把数据从数组映射到C++类。该类将只有私有成员变量,没有继承或虚拟内容。是安全的还是应该使用C++中的结构?< /p> void main(void) { uint8_t data[50]; MyClass *msg; msg = nullptr; for (int i = 0; i < 50; i++) { data[i] = i; } msg = (MyClass *) &data[0]; cout << msg->name(); },c++,class,struct,C++,Class,Struct,使用uint8\u t[]作为存储缓冲区是安全的,如果这是您的要求,是的。有效的用法如下所示: class MyClass { private: int name; public: int name(); //Getter void setName(); //Setter }; constexpr size_t array_size = 5; alignas(MyClass) uint8_t data[sizeof(MyClass) * array

使用
uint8\u t[]
作为存储缓冲区是安全的,如果这是您的要求,是的。有效的用法如下所示:

class MyClass
{
private:
    int name;

public:
    int name();        //Getter
    void setName();    //Setter
};
constexpr size_t array_size = 5;
alignas(MyClass) uint8_t data[sizeof(MyClass) * array_size ];
MyClass *msg = new(data) MyClass[array_size];

然后您可以随意使用
msg
。您的用法不正确-如果使用
uint8\u t
值填充
数据
,则无法像访问
MyClass
一样访问它。这将导致未定义的行为。

您可以针对标准布局类型来执行,但需要考虑对齐方式:

constexpr int bufmax = 50*sizeof(MyClass);
alignas(X) char buffer[bufmax];

然而,仅仅因为你可以,并不意味着你应该这条线的意义是什么?如果您想在正确分配前初始化
msg
,只需将其分配给
nullptr
,因为这样会导致内存泄漏。我建议您阅读序列化主题,尤其是boost库中的内容。比以二进制形式复制结构/类更安全,也更灵活。我在这里看到的唯一区别是,您可以保证数据[]与类的大小相同?关闭,但不关闭。至少您忽略了对齐,我很确定,如果类不是
标准布局
类型,那么所有二进制格式保证都会消失。也就是说,编译器可以随意重新排列成员。@RedAlert:嗯,对齐非常相关
sizeof(MyClass)
保证正确的字节数。它不能保证它们在内存中的正确位置对齐double必须在8字节标记上对齐,但您的代码不能保证
数据从8字节标记开始。