在 C++ 中刁赖,對(duì)象的復(fù)制可以通過拷貝構(gòu)造函數(shù)和賦值操作符來實(shí)現(xiàn)搁痛,這些復(fù)制機(jī)制包括淺拷貝、深拷貝和寫時(shí)拷貝(Copy-On-Write, COW)宇弛,它們對(duì)資源管理有著不同的影響鸡典。
淺拷貝(Shallow Copy)
淺拷貝僅復(fù)制對(duì)象的成員變量值。如果成員變量是指針枪芒,則新對(duì)象的指針會(huì)指向與原始對(duì)象相同的內(nèi)存地址彻况。這導(dǎo)致新對(duì)象與原始對(duì)象共享動(dòng)態(tài)分配的資源。淺拷貝適用于不可變對(duì)象或不包含動(dòng)態(tài)分配資源的對(duì)象舅踪。
深拷貝(Deep Copy)
深拷貝創(chuàng)建新對(duì)象時(shí)纽甘,會(huì)對(duì)原始對(duì)象中的每個(gè)動(dòng)態(tài)分配的資源進(jìn)行副本創(chuàng)建。這樣新對(duì)象擁有自己的資源副本抽碌,不與原始對(duì)象共享資源悍赢。深拷貝適用于包含指向動(dòng)態(tài)分配資源的指針的對(duì)象。
寫時(shí)拷貝(Copy-On-Write, COW)
寫時(shí)拷貝是一種性能優(yōu)化技術(shù)咬展,它避免了不必要的復(fù)制操作泽裳。在寫時(shí)拷貝中瞒斩,復(fù)制對(duì)象時(shí)不立即創(chuàng)建資源副本破婆,而是與原始對(duì)象共享資源。只有當(dāng)對(duì)象需要修改資源時(shí)胸囱,才會(huì)創(chuàng)建資源的副本祷舀。這通常發(fā)生在對(duì)象的成員函數(shù)被調(diào)用以修改資源時(shí)。寫時(shí)拷貝通過延遲復(fù)制操作提高了性能烹笔,但需要仔細(xì)管理資源的所有權(quán)和生命周期裳扯。
以下是深拷貝和淺拷貝的示例代碼:
#include <iostream>
class Resource {
public:
Resource() { std::cout << "Resource created" << std::endl; }
~Resource() { std::cout << "Resource destroyed" << std::endl; }
};
class MyClass {
public:
Resource* res;
MyClass() : res(new Resource()) {}
// 淺拷貝構(gòu)造函數(shù)
MyClass(const MyClass& other) : res(other.res) {}
// 深拷貝構(gòu)造函數(shù)
MyClass(const MyClass& other) : res(new Resource(*other.res)) {}
~MyClass() { delete res; }
};
int main() {
MyClass original;
MyClass shallowCopy = original; // 淺拷貝
MyClass deepCopy(original); // 深拷貝
return 0;
}
在這個(gè)例子中,淺拷貝構(gòu)造函數(shù)只是復(fù)制了指針谤职,而深拷貝構(gòu)造函數(shù)則創(chuàng)建了一個(gè)新的 Resource
對(duì)象饰豺。
C++ 標(biāo)準(zhǔn)庫中的 std::string
類采用了寫時(shí)拷貝機(jī)制。當(dāng) std::string
對(duì)象被復(fù)制時(shí)允蜈,并不會(huì)立即復(fù)制字符串?dāng)?shù)據(jù)冤吨,而是在需要修改字符串時(shí)才進(jìn)行復(fù)制蒿柳,從而在許多情況下避免了不必要的內(nèi)存分配和復(fù)制操作。