考虑复制一个不需要特殊复制语义的简单结构。
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
和'='之间有什么区别吗?
答案 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
碰巧分配了任何资源,这很容易导致泄密。