2011-04-16 37 views
1

我已經C++深複製嵌入了許多簡單的變量外加一個嵌套結構的結構。(memcpy的?)

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

我研究自己的答案,但同時我張貼,因爲極端的時間問題約束。提前致謝。

回答

5

在你的情況,分配應該只是罰款:

mySecondParent = myFirstParent; 

畢竟,沒有一個結構的定義指針。

此外,如果有指針,即使memcpy也不起作用,因爲它不會執行深度複製。在這種情況下,您必須手動複製指針的內容

順便說一下,您的代碼不會編譯,因爲您在之前使用anotherStruct來定義它。請在Parent之前定義anotherStruct

+0

如果** Parent **結構有一個std :: map或std :: string作爲其成員之一,那麼mySecondParent = myFirstParent是否仍然有效? – Shyam 2016-03-01 22:53:57

+1

@Shyam:是的。所有標準容器/類型都支持值語義,這意味着「分配」不會「深度複製」對象。 – Nawaz 2016-03-02 04:19:41

1
1

由於在你的類中沒有指針,所以默認編譯器生成的拷貝構造函數和委託運算符版本可以很好地工作(做你所謂的深層拷貝)。

從技術上講,這是一個淺拷貝。深層複製是當你的類包含指針並且你需要複製指針內容。

這應該做工精細沒有的memcpy(這不應該被用來複制C++對象)

Parent p1; 
Parent p2(p1); // Make a copy of p1 into p2. 
Parent p3; 

p1 = p3; // Use assignment operator works fine. 
0

一個簡單的分配新建分配FY謝靈運將正常工作適合你。一般來說,cimpiler(如Microsoft編譯器,如GCC)將選擇最有效的方法來複制內存。對於小型或簡單的事情,一系列的寄存器加載和保存往往是最好的表現。編譯器可以爲某些事情選擇memcpy()。

其他答案表明memcpy()永遠不能用於C++類。這是非常正確的,但是如果你知道自己在做什麼,它可以用在某些情況下。但這幾乎從不是必需的。

在AMD和Intel x86/x64處理器上,memcpy()總是生成(或使用)'rep movesd'指令。多年來,所有現代處理器都經過優化,具有特殊的微碼或其他內部啓動功能,可確保良好的小型和中型內存移動。

最好的辦法是在調試器中查看生成的彙編語言代碼。如果您的結構分配不是以一系列簡單的加載/存儲或memcopy(rep moved)結束的,那麼您可以自己使用memcpy()對其進行編碼。這會很好的工作,因爲你的課堂和講座使用「普通舊數據」。正如anohter答案所說,如果你的結構包含指針,那麼你將需要代碼來處理那些淺或深的副本,或引用計數的對象。

與往常一樣,對於'熱門'代碼路徑,剖析器和性能測量是必不可少的工具。