Dễ dàng hơn khi thực hiện sao chép-ghi-ghi trong ngôn ngữ hướng đối tượng, như C++. Ví dụ, hầu hết các lớp container trong Qt là copy-on-write.
Nhưng nếu khóa học bạn có thể làm điều đó trong C quá, nó chỉ là một số công việc nhiều hơn nữa. Khi bạn muốn gán dữ liệu của bạn cho một khối dữ liệu mới, bạn không làm một bản sao, thay vào đó bạn chỉ cần sao chép một con trỏ trong một trình bao bọc xung quanh dữ liệu của bạn. Bạn cần phải theo dõi trong các khối dữ liệu của bạn về trạng thái của dữ liệu. Nếu bây giờ bạn thay đổi thứ gì đó trong khối dữ liệu mới của mình, bạn tạo bản sao "thực" và thay đổi trạng thái. Dĩ nhiên, bạn không thể sử dụng các toán tử đơn giản như "=" để gán, thay vào đó cần phải có các hàm (Trong C++ bạn chỉ cần thực hiện quá tải toán tử).
Triển khai mạnh mẽ hơn nên sử dụng bộ đếm tham chiếu thay vì cờ đơn giản, tôi để nó tùy thuộc vào bạn.
Một ví dụ nhanh chóng và dơ bẩn: Nếu bạn có một
struct big {
//lots of data
int data[BIG_NUMBER];
}
bạn phải thực hiện chức năng assign và getters/setters mình.
// assume you want to implent cow for a struct big of some kind
// now instead of
struct big a, b;
a = b;
a.data[12345] = 6789;
// you need to use
struct cow_big a,b;
assign(&a, b); //only pointers get copied
set_some_data(a, 12345, 6789); // now the stuff gets really copied
//the basic implementation could look like
struct cow_big {
struct big *data;
int needs_copy;
}
// shallow copy, only sets a pointer.
void assign(struct cow_big* dst, struct cow_big src) {
dst->data = src.data;
dst->needs_copy = true;
}
// change some data in struct big. if it hasn't made a deep copy yet, do it here.
void set_some_data(struct cow_big* dst, int index, int data } {
if (dst->needs_copy) {
struct big* src = dst->data;
dst->data = malloc(sizeof(big));
*(dst->data) = src->data; // now here is the deep copy
dst->needs_copy = false;
}
dst->data[index] = data;
}
Bạn cũng cần phải viết các hàm tạo và hàm hủy. Tôi thực sự khuyên bạn nên c + + cho việc này.
Bạn đang sao chép loại dữ liệu nào?Sao chép trên ghi có thể không phải là giải pháp duy nhất. –