Es ist einfacher, Copy-on-Write in einer objektorientierten Sprache wie C++ zu implementieren. Zum Beispiel sind die meisten Containerklassen in Qt Copy-on-Write.
Aber natürlich können Sie das auch in C machen, es ist nur ein bisschen mehr Arbeit. Wenn Sie Ihre Daten einem neuen Datenblock zuweisen möchten, führen Sie keine Kopie durch, sondern kopieren einfach einen Zeiger in einen Wrapper um Ihre Daten. Sie müssen in Ihren Datensätzen den Status der Daten verfolgen. Wenn Sie nun etwas in Ihrem neuen Datenblock ändern, erstellen Sie eine "echte" Kopie und ändern den Status. Sie können natürlich nicht mehr die einfachen Operatoren wie "=" für die Zuweisung verwenden, sondern müssen Funktionen haben (In C++ würden Sie nur den Operator überladen).
Eine robustere Implementierung sollte Referenzzähler anstelle einer einfachen Flagge verwenden, ich überlasse es Ihnen.
A quick and dirty Beispiel: Wenn Sie eine
struct big {
//lots of data
int data[BIG_NUMBER];
}
haben Sie assign Funktionen und Getter/Setter selbst implementieren müssen.
// 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;
}
Sie müssen auch Konstruktoren und Destruktoren schreiben. Ich empfehle wirklich C++ dafür.
Welche Art von Daten kopieren Sie?Copy-on-Write ist möglicherweise nicht die einzige Lösung. –