From: Vadim Zeitlin Date: Mon, 15 Nov 1999 16:14:10 +0000 (+0000) Subject: optimisation in wxString::AllocBeforeWrite() - realloc() used instead malloc() whenev... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/fbf0c83d3c46922f1444423bbc0d8b6614169e13 optimisation in wxString::AllocBeforeWrite() - realloc() used instead malloc() whenever possible git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4574 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/common/string.cpp b/src/common/string.cpp index 60fcb535a7..3606bb9e55 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -391,13 +391,35 @@ void wxString::AllocBeforeWrite(size_t nLen) // must not share string and must have enough space wxStringData* pData = GetStringData(); - if ( pData->IsShared() || (nLen > pData->nAllocLength) ) { + if ( pData->IsShared() || pData->IsEmpty() ) { // can't work with old buffer, get new one pData->Unlock(); AllocBuffer(nLen); } else { - // update the string length + if ( nLen > pData->nAllocLength ) { + // realloc the buffer instead of calling malloc() again, this is more + // efficient + STATISTICS_ADD(Length, nLen); + + nLen += EXTRA_ALLOC; + + wxStringData *pDataOld = pData; + pData = (wxStringData*) + realloc(pData, sizeof(wxStringData) + (nLen + 1)*sizeof(wxChar)); + if ( !pData ) { + // out of memory + free(pDataOld); + + // FIXME we're going to crash... + return; + } + + pData->nAllocLength = nLen; + m_pchData = pData->data(); + } + + // now we have enough space, just update the string length pData->nDataLength = nLen; } @@ -429,11 +451,15 @@ void wxString::Alloc(size_t nLen) else { nLen += EXTRA_ALLOC; + wxStringData *pDataOld = pData; wxStringData *p = (wxStringData *) realloc(pData, sizeof(wxStringData) + (nLen + 1)*sizeof(wxChar)); if ( p == NULL ) { - // @@@ what to do on memory error? + // don't leak memory + free(pDataOld); + + // FIXME what to do on memory error? return; } @@ -451,13 +477,16 @@ void wxString::Shrink() { wxStringData *pData = GetStringData(); - // this variable is unused in release build, so avoid the compiler warning by - // just not declaring it + // this variable is unused in release build, so avoid the compiler warning + // by just not declaring it #ifdef __WXDEBUG__ void *p = #endif realloc(pData, sizeof(wxStringData) + (pData->nDataLength + 1)*sizeof(wxChar)); + // we rely on a reasonable realloc() implementation here - so far I haven't + // seen any which wouldn't behave like this + wxASSERT( p != NULL ); // can't free memory? wxASSERT( p == pData ); // we're decrementing the size - block shouldn't move! }