Copy on Write
Classes
RWCString,
RWWString, and
RWTValVirtualArray<T> use a technique called
copy on write to minimize copying. This technique offers the advantage of easy-to-understand value semantics with the speed of reference counted pointer implementation.
Here is how the technique works. When an
RWCString is initialized with another
RWCString via the copy constructor:
RWCString(const RWCString&);
the two strings share the same data until one of them tries to write to it. At that point, a copy of the data is made and the two strings go their separate ways. Copying only at “write” time makes copies of strings, particularly read-only copies, very inexpensive. In the following example, you can see how four objects share one copy of a string until one of the objects attempts to change the string:
#include <rw/cstring.h>
RWCString g; // Global object
void setGlobal(RWCString x) { g = x; }
int main(){
RWCString a("kernel"); // 1
RWCString b(a);
RWCString c(a); // 2
setGlobal(a); // Still only one copy of "kernel"! // 3
b += "s"; // Now b has its own data: "kernels" // 4
return 0;
}