使用memmove / memcpy初始化带有构造函数参数的对象是否安全?
似乎没有人使用这种方法,但是当我尝试过时它可以正常工作。
在堆栈中传递参数是否会导致问题?

假设我的班级foo如下,

class foo
{
  int x,y;
  float z;
  foo();
  foo(int,int,float);
};


我可以使用memmove如下初始化变量吗?

foo::foo(int x,int y,float z)
{
  memmove(this,&x, sizeof(foo));
}

最佳答案

这是未定义的行为。

所示代码不会尝试初始化类变量。它尝试memmove()到类指针上,并假定类的大小为2*sizeof(int)+sizeof(float)。 C ++标准不保证这一点。

此外,所示代码还假定传递给构造函数的参数的布局与此POD成员的布局相同。同样,C ++标准未指定。

使用memmove初始化单个类成员是安全的。例如,以下是安全的:

foo::foo(int x_,int y_,float z_)
{
   memmove(&x, &x_, sizeof(x));
   memmove(&y, &y_, sizeof(y));
   memmove(&z, &z_, sizeof(z));
}


当然,这没有任何用处,但这是安全的。

关于c++ - 使用Memmove在C++中的构造函数中初始化整个对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39677507/

10-09 03:55