Use realloc instead of malloc+memcpy when growing a POD SmallVector. A smart

realloc implementation can try to expand the allocated memory block in-place,
avoiding the copy.

llvm-svn: 105605
This commit is contained in:
Benjamin Kramer 2010-06-08 11:44:30 +00:00
parent cd9e1d8b97
commit d62b29412b
2 changed files with 16 additions and 12 deletions

View File

@ -17,6 +17,7 @@
#include "llvm/Support/type_traits.h"
#include <algorithm>
#include <cassert>
#include <cstdlib>
#include <cstring>
#include <memory>
@ -207,7 +208,7 @@ void SmallVectorTemplateBase<T, isPodLike>::grow(size_t MinSize) {
size_t NewCapacity = 2*CurCapacity;
if (NewCapacity < MinSize)
NewCapacity = MinSize;
T *NewElts = static_cast<T*>(operator new(NewCapacity*sizeof(T)));
T *NewElts = static_cast<T*>(malloc(NewCapacity*sizeof(T)));
// Copy the elements over.
this->uninitialized_copy(this->begin(), this->end(), NewElts);
@ -217,7 +218,7 @@ void SmallVectorTemplateBase<T, isPodLike>::grow(size_t MinSize) {
// If this wasn't grown from the inline copy, deallocate the old space.
if (!this->isSmall())
operator delete(this->begin());
free(this->begin());
this->setEnd(NewElts+CurSize);
this->BeginX = NewElts;
@ -282,7 +283,7 @@ public:
// If this wasn't grown from the inline copy, deallocate the old space.
if (!this->isSmall())
operator delete(this->begin());
free(this->begin());
}

View File

@ -21,15 +21,18 @@ void SmallVectorBase::grow_pod(size_t MinSizeInBytes, size_t TSize) {
size_t NewCapacityInBytes = 2 * capacity_in_bytes();
if (NewCapacityInBytes < MinSizeInBytes)
NewCapacityInBytes = MinSizeInBytes;
void *NewElts = operator new(NewCapacityInBytes);
// Copy the elements over. No need to run dtors on PODs.
memcpy(NewElts, this->BeginX, CurSizeBytes);
// If this wasn't grown from the inline copy, deallocate the old space.
if (!this->isSmall())
operator delete(this->BeginX);
void *NewElts;
if (this->isSmall()) {
NewElts = malloc(NewCapacityInBytes);
// Copy the elements over. No need to run dtors on PODs.
memcpy(NewElts, this->BeginX, CurSizeBytes);
} else {
// If this wasn't grown from the inline copy, grow the allocated space.
NewElts = realloc(this->BeginX, NewCapacityInBytes);
}
this->EndX = (char*)NewElts+CurSizeBytes;
this->BeginX = NewElts;
this->CapacityX = (char*)this->BeginX + NewCapacityInBytes;