我允许用memcpy(*this)修改构造函数中的所有类成员
Am i allowed to modifiy all the class members inside the constructor with a 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);
这是合法的吗?
我不太确定。取决于上下文。在您的情况下,它可以正常工作并编译,而不会像预期的
这样的错误或警告安全?
当然不是。
它以各种方式称为未定义的行为。
-
this
不仅包括数据成员。也许有像Vtable一样的东西。 - 允许编译器更改成员变量的内存布局。因此可能会发生填充。
- 因为数据是通过网络互换的,所以endianess开始发挥作用,必须在de/serialization期间考虑
您应该注意,任何类型的reinterpret_cast
(即C风格(在某种程度上给您不确定的行为。您需要100%知道您在做什么,我建议每次使用此类构造时检查发射的汇编输出和内存布局。
保证可以成功编译而没有错误消息。因此,根据定义,它是100%合法的。
在这种特殊情况下,它将按预期工作。但是,如果一个结构使用虚拟函数,它将存储VPTR,并且此内容将行不通。例如,您可以稍后添加虚拟函数,并且构造函数将停止工作。所以不,这不是安全的。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 继承:构造函数,初始化C++11中基类的类C数组成员
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 如果基类包含双指针成员,则派生类的构造函数
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- constexpr构造函数需要常量成员函数时出现问题
- 如何在c++中定义以struct为数据成员的类中的构造函数
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- std::ofstream 作为类成员删除复制构造函数?
- c++构造函数成员初始化:传递参数
- C++初始化类实例时隐式调用类成员的构造函数
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 在构造函数中输入对象时C++类成员作用域
- 解释了构造函数成员初始化列表
- 构造函数成员初始值设定项跨成员列出,安全吗?
- C 构造函数成员分配优化
- 类内/构造函数成员初始化
- 在构造函数成员初始化之前调用成员函数的语法
- 非构造函数成员函数中的显式字符串行为