我有
struct Parent
{
int child1;
int child2;
char child3;
float child 4;
anotherStruct child5;
};
typedef struct
{
unsigned char x;
int y;
char z;
float a;
int b;
char c;
etc ..
} anotherStruct;
Parent myFirstParent;
Parent mySecondParent;
///I want to do a deep copy of myFirstParent into mySecondParent.
//does the follwowing work for that purpose??
memcpy (&mySecondParent, &myFirstParent, sizeof(myFirstParent);
我正在调查答案,但同时由于极端时间限制,我发布了这个问题。提前谢谢。
答案 0 :(得分:5)
在你的情况下,作业应该正常工作:
mySecondParent = myFirstParent;
毕竟,没有一个结构定义指针。
此外,如果有指针,即使memcpy
也不起作用,因为它不会进行深层复制。在这种情况下,您必须手动复制指针的内容。
顺便说一句,您的代码无法编译,因为您在定义它之前使用anotherStruct
。请在anotherStruct
之前定义Parent
。
答案 1 :(得分:1)
根据经验
请记住一件事:memcpy()是邪恶的!它是一个你不应该在C ++中使用的C构造。 memcpy()对位和字节进行操作,而不是对象。在最坏的情况下,它没有考虑到您正在复制的对象中实际存储的内容,导致错误的结果,甚至是考虑到特殊情况的丑陋代码。切勿在C ++代码中使用memcpy()。总是有更好的,更面向对象的方式来做同样的事情。
这可能不适用于您的情况,因为您没有使用免费商店,但有时您可以使用免费商店。
答案 2 :(得分:1)
由于您的类中没有指针,因此默认编译器生成的复制构造函数和assignemnt运算符的版本将正常工作(执行您所谓的深层复制)。
从技术上讲,这是一个浅层副本。深层复制是指您的类包含指针,并且您需要复制指针内容。
如果没有memcpy(永远不能用于复制C ++对象),这应该可以正常工作
Parent p1;
Parent p2(p1); // Make a copy of p1 into p2.
Parent p3;
p1 = p3; // Use assignment operator works fine.
答案 3 :(得分:0)
一个简单的分配结构对你来说很好。通常,cimpiler(如Microsoft编译器,以及类似GCC)将选择最有效的复制内存的方法。对于小型或简单的事物,一系列寄存器加载和保存通常是最好的。对于某些事情,编译器可以选择memcpy()。
其他答案表明永远不应该使用memcpy()与C ++类。这通常是正确的,但如果你知道你正在做什么,它可以在某些情况下使用。但这几乎是不必要的。
在AMD和Intel x86 / x64处理器上,memcpy()始终生成(或使用)'rep movesd'指令。许多年来,所有现代处理器都针对这种解决方案进行了优化,具有特殊的微代码或其他内部选择,以确保良好的小型和中型大小的内存移动。
最好的办法就是在调试器中查看生成的汇编语言代码。如果您的结构赋值不是以一系列简单的加载/存储或memcopy(rep moved)结束,那么您可以自己使用memcpy()编写一个。这样可以正常工作,因为您的类和结构使用的是“普通旧数据”。正如anohter的回答所说,如果您的结构包含指针,那么您将需要代码来处理浅层或深层副本或引用计数对象。
与往常一样,对于“热门”代码路径,分析器和性能测量是必不可少的工具。