【问题标题】:Safe to map array to C++ class?将数组映射到 C++ 类安全吗?
【发布时间】:2014-11-14 23:34:06
【问题描述】:

我想将数据从数组映射到 C++ 类。该类将只有私有成员变量,没有继承或虚拟的东西。这是安全的还是我应该在 C++ 中使用结构?

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();
}

类如下所示:

class MyClass
{
private:
    int name;

public:
    int name();        //Getter
    void setName();    //Setter
};

【问题讨论】:

  • msg = new MyClass(); 这条线的意义何在?如果您想在正确分配之前初始化msg,只需将其分配给nullptr,因为它代表您正在泄漏内存。
  • 我建议您阅读有关序列化的主题,尤其是从 boost 库。比复制二进制结构/类更安全,更灵活。

标签: c++ class struct


【解决方案1】:

您可以为标准布局类型执行此操作,但您需要考虑对齐是否良好:

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

然而,仅仅因为你可以并不意味着你应该

【讨论】:

    【解决方案2】:

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

    constexpr size_t array_size = 5;
    alignas(MyClass) uint8_t data[sizeof(MyClass) * array_size ];
    MyClass *msg = new(data) MyClass[array_size];
    

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

    【讨论】:

    • 我在这里看到的唯一区别是您保证 data[] 与类的大小相同?
    • 关闭,但没有雪茄。你至少忽略了对齐,我很确定如果类不是 standard-layout 类型,所有二进制格式的保证都会消失。 IE,编译器可以随意重新排列成员。
    • @RedAlert:嗯,对齐非常重要。 sizeof(MyClass) 保证您正确的字节数。它不能保证它们在内存中的正确位置对齐。 x64 中的 double 必须在 8 字节标记上对齐,但您的代码不能保证 data 从 8 字节标记开始。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2020-02-10
    • 1970-01-01
    • 2021-08-16
    • 2023-01-01
    相关资源
    最近更新 更多