mirror of
https://github.com/wolfpld/tracy.git
synced 2025-03-20 07:40:02 +08:00
Don't init unused memory on vector realloc.
Warning, this change may break things in unexpected ways!
This commit is contained in:
parent
d150e688f5
commit
d63a15a570
@ -5,6 +5,7 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
#include "../common/TracyForceInline.hpp"
|
#include "../common/TracyForceInline.hpp"
|
||||||
@ -41,13 +42,13 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
tracy_force_inline Vector( const T& value )
|
tracy_force_inline Vector( const T& value )
|
||||||
: m_ptr( new T[1] )
|
: m_ptr( (T*)malloc( sizeof( T ) ) )
|
||||||
, m_size( 1 )
|
, m_size( 1 )
|
||||||
, m_capacity( 0 )
|
, m_capacity( 0 )
|
||||||
, m_magic( 0 )
|
, m_magic( 0 )
|
||||||
{
|
{
|
||||||
memUsage += sizeof( T );
|
memUsage += sizeof( T );
|
||||||
m_ptr[0] = value;
|
new(m_ptr) T( value );
|
||||||
}
|
}
|
||||||
|
|
||||||
tracy_force_inline ~Vector()
|
tracy_force_inline ~Vector()
|
||||||
@ -55,7 +56,8 @@ public:
|
|||||||
if( m_capacity != MaxCapacity() && m_ptr )
|
if( m_capacity != MaxCapacity() && m_ptr )
|
||||||
{
|
{
|
||||||
memUsage -= Capacity() * sizeof( T );
|
memUsage -= Capacity() * sizeof( T );
|
||||||
delete[] (T*)m_ptr;
|
const auto sz = size();
|
||||||
|
free( m_ptr );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,7 +67,8 @@ public:
|
|||||||
if( m_capacity != MaxCapacity() && m_ptr )
|
if( m_capacity != MaxCapacity() && m_ptr )
|
||||||
{
|
{
|
||||||
memUsage -= Capacity() * sizeof( T );
|
memUsage -= Capacity() * sizeof( T );
|
||||||
delete[] (T*)m_ptr;
|
const auto sz = size();
|
||||||
|
free( m_ptr );
|
||||||
}
|
}
|
||||||
memcpy( this, &src, sizeof( Vector<T> ) );
|
memcpy( this, &src, sizeof( Vector<T> ) );
|
||||||
memset( &src, 0, sizeof( Vector<T> ) );
|
memset( &src, 0, sizeof( Vector<T> ) );
|
||||||
@ -106,34 +109,39 @@ public:
|
|||||||
{
|
{
|
||||||
assert( m_capacity != MaxCapacity() );
|
assert( m_capacity != MaxCapacity() );
|
||||||
if( m_size == Capacity() ) AllocMore();
|
if( m_size == Capacity() ) AllocMore();
|
||||||
m_ptr[m_size++] = v;
|
new(m_ptr+m_size) T( v );
|
||||||
|
m_size++;
|
||||||
}
|
}
|
||||||
|
|
||||||
tracy_force_inline void push_back_non_empty( const T& v )
|
tracy_force_inline void push_back_non_empty( const T& v )
|
||||||
{
|
{
|
||||||
assert( m_capacity != MaxCapacity() );
|
assert( m_capacity != MaxCapacity() );
|
||||||
if( m_size == CapacityNoNullptrCheck() ) AllocMore();
|
if( m_size == CapacityNoNullptrCheck() ) AllocMore();
|
||||||
m_ptr[m_size++] = v;
|
new(m_ptr+m_size) T( v );
|
||||||
|
m_size++;
|
||||||
}
|
}
|
||||||
|
|
||||||
tracy_force_inline void push_back_no_space_check( const T& v )
|
tracy_force_inline void push_back_no_space_check( const T& v )
|
||||||
{
|
{
|
||||||
assert( m_capacity != MaxCapacity() );
|
assert( m_capacity != MaxCapacity() );
|
||||||
assert( m_size < Capacity() );
|
assert( m_size < Capacity() );
|
||||||
m_ptr[m_size++] = v;
|
new(m_ptr+m_size) T( v );
|
||||||
|
m_size++;
|
||||||
}
|
}
|
||||||
|
|
||||||
tracy_force_inline void push_back( T&& v )
|
tracy_force_inline void push_back( T&& v )
|
||||||
{
|
{
|
||||||
assert( m_capacity != MaxCapacity() );
|
assert( m_capacity != MaxCapacity() );
|
||||||
if( m_size == Capacity() ) AllocMore();
|
if( m_size == Capacity() ) AllocMore();
|
||||||
m_ptr[m_size++] = std::move( v );
|
new(m_ptr+m_size) T( std::move( v ) );
|
||||||
|
m_size++;
|
||||||
}
|
}
|
||||||
|
|
||||||
tracy_force_inline T& push_next()
|
tracy_force_inline T& push_next()
|
||||||
{
|
{
|
||||||
assert( m_capacity != MaxCapacity() );
|
assert( m_capacity != MaxCapacity() );
|
||||||
if( m_size == Capacity() ) AllocMore();
|
if( m_size == Capacity() ) AllocMore();
|
||||||
|
new(m_ptr+m_size) T();
|
||||||
return m_ptr[m_size++];
|
return m_ptr[m_size++];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,6 +149,7 @@ public:
|
|||||||
{
|
{
|
||||||
assert( m_capacity != MaxCapacity() );
|
assert( m_capacity != MaxCapacity() );
|
||||||
assert( m_size < Capacity() );
|
assert( m_size < Capacity() );
|
||||||
|
new(m_ptr+m_size) T();
|
||||||
return m_ptr[m_size++];
|
return m_ptr[m_size++];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -152,6 +161,7 @@ public:
|
|||||||
if( m_size == Capacity() ) AllocMore();
|
if( m_size == Capacity() ) AllocMore();
|
||||||
if( dist != m_size ) memmove( m_ptr + dist + 1, m_ptr + dist, ( m_size - dist ) * sizeof( T ) );
|
if( dist != m_size ) memmove( m_ptr + dist + 1, m_ptr + dist, ( m_size - dist ) * sizeof( T ) );
|
||||||
m_size++;
|
m_size++;
|
||||||
|
new(m_ptr+dist) T( v );
|
||||||
m_ptr[dist] = v;
|
m_ptr[dist] = v;
|
||||||
return m_ptr + dist;
|
return m_ptr + dist;
|
||||||
}
|
}
|
||||||
@ -164,7 +174,7 @@ public:
|
|||||||
if( m_size == Capacity() ) AllocMore();
|
if( m_size == Capacity() ) AllocMore();
|
||||||
if( dist != m_size ) memmove( m_ptr + dist + 1, m_ptr + dist, ( m_size - dist ) * sizeof( T ) );
|
if( dist != m_size ) memmove( m_ptr + dist + 1, m_ptr + dist, ( m_size - dist ) * sizeof( T ) );
|
||||||
m_size++;
|
m_size++;
|
||||||
m_ptr[dist] = std::move( v );
|
new(m_ptr+dist) T( std::move( v ) );
|
||||||
return m_ptr + dist;
|
return m_ptr + dist;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -274,7 +284,7 @@ private:
|
|||||||
if( m_ptr == nullptr )
|
if( m_ptr == nullptr )
|
||||||
{
|
{
|
||||||
memUsage += sizeof( T );
|
memUsage += sizeof( T );
|
||||||
m_ptr = new T[1];
|
m_ptr = (T*)malloc( sizeof( T ) );
|
||||||
m_capacity = 0;
|
m_capacity = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -287,7 +297,7 @@ private:
|
|||||||
|
|
||||||
void Realloc()
|
void Realloc()
|
||||||
{
|
{
|
||||||
T* ptr = new T[CapacityNoNullptrCheck()];
|
T* ptr = (T*)malloc( sizeof( T ) * CapacityNoNullptrCheck() );
|
||||||
if( m_size != 0 )
|
if( m_size != 0 )
|
||||||
{
|
{
|
||||||
if( std::is_trivially_copyable<T>() )
|
if( std::is_trivially_copyable<T>() )
|
||||||
@ -298,10 +308,10 @@ private:
|
|||||||
{
|
{
|
||||||
for( uint32_t i=0; i<m_size; i++ )
|
for( uint32_t i=0; i<m_size; i++ )
|
||||||
{
|
{
|
||||||
ptr[i] = std::move( m_ptr[i] );
|
new(ptr+i) T( std::move( m_ptr[i] ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
delete[] (T*)m_ptr;
|
free( m_ptr );
|
||||||
}
|
}
|
||||||
m_ptr = ptr;
|
m_ptr = ptr;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user