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


struct Something
{
    int a;
    int b;
    Something(char* buffer)
    {
        memcpy(this, buffer, sizeof(Something));
    };
};

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

...从添加构造函数后它不再是POD类型的事实。

那不是事实(仅是假新闻;-)(。添加构造函数不会更改struct S POD类型状态。

您也可以轻松地使用static_assert

static_assert( "Something must be a POD type!",std::is_pod(Something)::value);

这是合法的吗?

我不太确定。取决于上下文。在您的情况下,它可以正常工作并编译,而不会像预期的

这样的错误或警告

安全?

当然不是。

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

  1. this不仅包括数据成员。也许有像Vtable一样的东西。
  2. 允许编译器更改成员变量的内存布局。因此可能会发生填充。
  3. 因为数据是通过网络互换的,所以endianess开始发挥作用,必须在de/serialization期间考虑

您应该注意,任何类型的reinterpret_cast(即C风格(在某种程度上给您不确定的行为。您需要100%知道您在做什么,我建议每次使用此类构造时检查发射的汇编输出和内存布局。

保证可以成功编译而没有错误消息。因此,根据定义,它是100%合法的。

在这种特殊情况下,它将按预期工作。但是,如果一个结构使用虚拟函数,它将存储VPTR,并且此内容将行不通。例如,您可以稍后添加虚拟函数,并且构造函数将停止工作。所以不,这不是安全的。

最新更新