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);
这是合法的吗?
我不太确定。取决于上下文。在您的情况下,它可以正常工作并编译,而不会像预期的
这样的错误或警告安全?
当然不是。
它以各种方式称为未定义的行为。
-
this
不仅包括数据成员。也许有像Vtable一样的东西。 - 允许编译器更改成员变量的内存布局。因此可能会发生填充。
- 因为数据是通过网络互换的,所以endianess开始发挥作用,必须在de/serialization期间考虑
您应该注意,任何类型的reinterpret_cast
(即C风格(在某种程度上给您不确定的行为。您需要100%知道您在做什么,我建议每次使用此类构造时检查发射的汇编输出和内存布局。
保证可以成功编译而没有错误消息。因此,根据定义,它是100%合法的。
在这种特殊情况下,它将按预期工作。但是,如果一个结构使用虚拟函数,它将存储VPTR,并且此内容将行不通。例如,您可以稍后添加虚拟函数,并且构造函数将停止工作。所以不,这不是安全的。