c++ - 在 C++ 的构造函数中使用 memmove 初始化整个对象

标签 c++ memcpy memmove

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

相关文章:

c++ - 如果Spark的数据会在堆外缓存,它会有字节级规范吗?

c++ - 在整个 union 上使用 std::memcpy 是否保证保留事件的 union 成员?

使用 memcpy 连接两个 int 数组

c - memmove 和 memcpy 有什么区别?

memcpy - 什么时候应该使用 memcpy,什么时候应该使用 memmove?

c - 一般堆栈推送错误

c++ - c-casting to type 反对 c-casting to type's reference

C++ 读取行到类 vector

c++ - 类中的 "this"指针

c - memcpy 问题