我允许用memcpy(*this)修改构造函数中的所有类成员吗?

Gam*_*Gam 6 c++

struct Something
{
    int a;
    int b;

    Something(char* buffer)
    {
        memcpy(this, buffer, sizeof(Something));
    };
};
Run Code Online (Sandbox Code Playgroud)

这合法吗?安全?对我来说它看起来很好,但我不确定C++标准是否以某种方式禁止它.

πάν*_*ῥεῖ 0

...因为在我添加构造函数之后它不再是 POD 类型。

这不是事实(只是假新闻;-))。添加构造函数不会更改structs POD 类型状态。

您还可以使用以下命令轻松检查static_assert

static_assert( "Something must be a POD type!",std::is_pod(Something)::value);
Run Code Online (Sandbox Code Playgroud)

这合法吗?

我不确定。取决于上下文。在你的系统中,它可以正常工作并编译,不会出现预期的错误或警告

安全的?

当然不是。

它以各种方式调用未定义的行为。

  1. this可能不仅仅包含数据成员。也许有诸如 vtable 之类的东西。
  2. 编译器可以改变成员变量的内存布局。所以可能会发生填充
  3. 由于数据是通过网络交换的,字节顺序开始发挥作用,并且在反/序列化期间必须考虑

您应该注意,任何类型reinterpret_cast(即 c 风格转换)都会在某种程度上给您带来未定义的行为。您需要 100% 知道自己在做什么,我建议每次使用此类构造时都检查发出的程序集输出和内存布局。

  • 1) 在这种情况下没有 vtable,2) 在这种情况下,您还可以复制填充。 (4认同)