使用 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++ - 在 C++ 的构造函数中使用 memmove 初始化整个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39677507/