memcpy和' ='之间的区别复制简单结构时

时间:2014-03-20 03:27:12

标签: c++ c struct memcpy

考虑复制一个不需要特殊复制语义的简单结构。

struct A
{
    char i
    int i;
    long l;
    double b;
    //...maybe more member
}
struct A a;
a.c = 'a'; //skip other member just for illustrate
struct A b;
memset(&a, 0, sizeof(a));
b.c = a.c;
//...for other members, the first way to assign
memcpy(&b, &a, sizeof(b)); //the second way
b = a;    //the third way

3种方法做同样的事情,似乎所有这些方法都是正确的。我曾经使用'memcpy'来复制简单的结构,但现在似乎'='可以做同样的事情。那么使用memcpy和'='之间有什么区别吗?

3 个答案:

答案 0 :(得分:6)

memcpy将结构视为一个连续的字节数组,并只复制它们。因此,它将始终复制成员之后的填充字节。

=只需要复制成员。它可能会也可能不会复制填充。

答案 1 :(得分:1)

三种方法中的任何一种 - 手动分配每个成员,分配整个结构或使用memcpy - 将导致b的所有成员与a的相应成员相同这是你应该关心的。填充字节的值可能存在差异 - memcpy将复制它们,分配单个成员不会,并且分配整个结构可能会也可能不会 - 这取决于实现。有些实现只使用memcpy来指定结构,有些会按成员分配成员,有些会根据结构的大小等因素做一个或另一个。

我建议使用结构分配 - 它是最简单,最短,最以问题为导向的。将实现细节留给编译器。此外,在C ++中,您可以自己定义赋值运算符以获得更好的控制和灵活性,并且memcpy不受欢迎,并且可能会对类产生不良影响(请参阅JaredPar的答案)。

答案 2 :(得分:1)

我现在习惯使用=代替memcpy。在C中,差异是最小的,但是一旦你毕业到C ++,正如问题所示,差异是巨大的。考虑例如

struct C {
  C() { }
  ~C() { } 
}

C local1;
C local2;
memcpy(&local2, &local1, sizeof(C));

在这种情况下,local2的构造函数在声明点运行。但是,该值的析构函数永远不会运行。相反,它的成员被memcpy神奇地替换,而析构函数在memcpy位上运行。如果C碰巧分配了任何资源,这很容易导致泄密。