使用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/