嵌入许多简单变量加上一个嵌套结构的结构的C ++深层复制..(memcpy?)

时间:2011-04-16 14:22:46

标签: c++ nested structure memcpy deep-copy

我有

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);

我正在调查答案,但同时由于极端时间限制,我发布了这个问题。提前谢谢。

4 个答案:

答案 0 :(得分:5)

在你的情况下,作业应该正常工作:

mySecondParent = myFirstParent;

毕竟,没有一个结构定义指针。

此外,如果有指针,即使memcpy也不起作用,因为它不会进行深层复制。在这种情况下,您必须手动复制指针的内容

顺便说一句,您的代码无法编译,因为您在定义它之前使用anotherStruct 。请在anotherStruct之前定义Parent

答案 1 :(得分:1)

根据经验

  

请记住一件事:memcpy()是邪恶的!它是一个你不应该在C ++中使用的C构造。 memcpy()对位和字节进行操作,而不是对象。在最坏的情况下,它没有考虑到您正在复制的对象中实际存储的内容,导致错误的结果,甚至是考虑到特殊情况的丑陋代码。切勿在C ++代码中使用memcpy()。总是有更好的,更面向对象的方式来做同样的事情。

这可能不适用于您的情况,因为您没有使用免费商店,但有时您可以使用免费商店。

SOURCE

答案 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的回答所说,如果您的结构包含指针,那么您将需要代码来处理浅层或深层副本或引用计数对象。

与往常一样,对于“热门”代码路径,分析器和性能测量是必不可少的工具。