Es más fácil implementar copy-on-write en un lenguaje orientado a objetos, como C++. Por ejemplo, la mayoría de las clases de contenedor en Qt son copy-on-write.
Pero si por supuesto también puedes hacer eso en C, es solo un poco más de trabajo. Cuando quiere asignar sus datos a un nuevo bloque de datos, no hace una copia, en su lugar solo copia un puntero en un borde de envoltura alrededor de sus datos. Debe realizar un seguimiento en sus bloques de datos del estado de los datos. Si ahora cambias algo en tu nuevo bloque de datos, haces una copia "real" y cambias el estado. No puede, por supuesto, dejar de utilizar los operadores simples como "=" para la asignación, en lugar de eso, debe tener funciones (en C++ simplemente haría sobrecarga del operador).
Una implementación más robusta debería usar contadores de referencia en lugar de una simple bandera, lo dejo a usted.
Un ejemplo rápido y sucio: Si usted tiene un
struct big {
//lots of data
int data[BIG_NUMBER];
}
usted tiene que poner en práctica las funciones y asignar getters/setters mismo.
// 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;
}
Necesita escribir constructores y destructores también. Realmente recomiendo C++ para esto.
¿Qué tipo de datos está copiando?Copy-on-write podría no ser la única solución. –