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

时间:2017-06-25 14:07:38

标签: c++

struct Something
{
    int a;
    int b;

    Something(char* buffer)
    {
        memcpy(this, buffer, sizeof(Something));
    };
};

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

2 个答案:

答案 0 :(得分:0)

  

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

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

您还可以使用static_assert

轻松检查此问题
static_assert( "Something must be a POD type!",std::is_pod(Something)::value);
  

这合法吗?

我不太确定。取决于上下文。在你的工作和编译没有错误或警告,如预期的

  

安全?

当然不是。

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

  1. this可能不仅包含数据成员。也许有像vtable这样的东西。
  2. 允许编译器更改成员变量的内存布局。 So padding might occur
  3. 因为数据是通过网络互换的,所以endianess发挥作用,并且必须在去/序列化时考虑
  4. 你应该注意,任何类型的reinterpret_cast(即c式演员)都会在某种程度上给你未定义的行为。 您需要100%知道自己在做什么,并建议每次使用此类构造时检查发出的程序集输出和内存布局。

答案 1 :(得分:-8)

保证在没有错误消息的情况下成功编译。因此,根据定义,它是100%合法的。

在这种特殊情况下,它可以按预期工作。但是,如果一个结构使用虚函数,它会存储vptr,这个东西不起作用。例如,您可能稍后添加一个虚函数,构造函数将停止工作。所以不,这不安全。