Luiz Capitulino wrote: > > qstring = qemu_malloc(sizeof(*qstring)); > > - qstring->string = qemu_strdup(str); > > + > > + qstring->length = strlen(str); > > + qstring->capacity = qstring->length; > > + > > + qstring->string = qemu_malloc(qstring->capacity + 1); > > + memcpy(qstring->string, str, qstring->length); > > + qstring->string[qstring->length] = 0; > > Couldn't this be: > > qstring->string = qemu_strdup(str); > qstring->length = qstring->capacity = strlen(str);
Probably to have one call to strlen() instead of two (one inside qemu_strdup()). > > +void qstring_append(QString *qstring, const char *str) > > +{ > > + size_t len = strlen(str); > > + > > + if (qstring->capacity < (qstring->length + len)) { > > + qstring->capacity += len; > > + qstring->capacity *= 2; /* use exponential growth */ > > + > > + qstring->string = qemu_realloc(qstring->string, qstring->capacity > > + 1); > > + } > > Why do we need to double it? Wouldn't be enough to only keep track > of the current string length and add 'len' to it? We could drop > 'capacity' then. You need exponential growth if large stringes are to be grown in O(n) time where n is the number of characters, appended in small pieces. Think about the time spent copying bytes every time qemu_realloc() is called. If you just add 'len' each time, think about appending 1 byte 10^4 times. It will copy approximately 10^8/2 bytes, which is a lot just to make a string 10^4 bytes long. But += len; *= 2 is not necessary. *= 2 is enough, provided the result is large enough. > > + memcpy(qstring->string + qstring->length, str, len); > > + qstring->length += len; > > + qstring->string[qstring->length] = 0; > > I would use strcat(). Again, that's an extra call to strlen(), traversing the string twice instead of once. Doesn't make much different for small strings, only large ones. -- Jamie