I can't use free() or HeapFree(), they're too slow.
You ( Mr. Fatica ) told Mr. Blekhman:
??? HeapCreate/HeapDestroy ( 1 page ) takes about 15 times
the time that HeapAlloc/HeapFree ( 1 page ) takes. ???.
Quite simply, I can't use free() or HeapFree(), they're too slow.
At times, I litterally free millions of pointers
with just one call to HeapDestroy().
.................
From X.CPP in ??? www.Cotse.NET/users/jeffrelf/Games.ZIP ???,
I use dynamic arrays kind of like this:
#define CRLF ( Ch == 10 || Ch == 13 )
#define While( Should_Loop ) Ch = 1 , P -- ; \
while ( Ch \\
&& ( Ch = * ++ P , Ch2 = ! Ch ? 0 : P [ 1 ] , Should_Loop ) )
#define Zero( X ) memset( & X, 0, sizeof X )
#define LoopXx( Tt, _Xx ) \
Tt##T & Xx = _Xx ; Tt##P P = 0, B ; int J = -1 ; \
Tt##A BB = Xx.BB, EE = Xx.PP + 1 , PP = BB - 1 ; \
if ( BB ) while ( ++ J , B = P = * ++ PP , PP < EE )
#define ReBuff( N ) ( \
B_Cache = MallocTmp( Max_Buff = ER ( N, Max_Header ) ) \
, B_Sh = MallocTmp( Max_Sh = Max_Buff ) )
#define NewHeap ( Heap = HeapCreate( HEAP_NO_SERIALIZE, 0, 0 ) \
, ReBuff( 0 ), Ptrs = ( LnA ) MallocTmp( SzPtrs = 10000 * SzPtr ) )
#define MallocTmp( Sz ) ( LnP ) HeapAlloc( Heap, 0, Sz )
#define ReAlloc_Tmp( P, Sz ) _HeapReAlloc( Heap, 0, P, Sz )
#define ReAlloc( P, Sz ) ( LnP ) realloc( P, Sz )
..............
typedef uchar * _LnP ; typedef char * __LnP ;
typedef wchar_t * LnP ; typedef LnP * LnA ;
struct LnT { LnA BB, PP, EE ; };
..................
inline LnP _HeapReAlloc( HANDLE H, uint F, void * P, int Sz ) {
return LnP(
P ? HeapReAlloc( H, F, P, Sz ) : HeapAlloc( H, F, Sz ) ); }
template < typename TyT, typename TyA, typename TyP >
TyP & Inc( TyT & Xx, int N ) { int Temp_Heap = N >= 0 ;
if ( ! Temp_Heap ) N = 1 ;
int I_PP = ! Xx.PP ? -1 : Xx.PP - Xx.BB, I_EE = Xx.EE - Xx.BB
, New_I_PP = I_PP + N, New_I_EE = New_I_PP + 1024 ;
if ( New_I_PP >= I_EE ) { int Sz = New_I_EE * SzPtr ;
if ( Temp_Heap )
Xx.BB = ( TyA ) _HeapReAlloc( Heap, HEAP_ZERO_MEMORY, Xx.BB, Sz );
else { int Sz_Dif = Sz - I_EE * SzPtr ;
if ( Sz_Dif > 0 ) {
Xx.BB = ( TyA ) ReAlloc( Xx.BB, Sz );
memset( Xx.BB + I_EE, 0, Sz_Dif ); } }
Xx.EE = Xx.BB + New_I_EE ; }
return * ( Xx.PP = Xx.BB + New_I_PP ); }
AgP & Inc ( AgT & Ag ) { return Inc< AgT, AgA, AgP> ( Ag, 1 ) ; }
UsP & Inc ( UsT & Us ) { return Inc< UsT, UsA, UsP> ( Us, 1 ) ; }
LsP & Inc ( LsT & Ls ) { return Inc< LsT, LsA, LsP> ( Ls, 1 ) ; }
LnP & Inc ( LnT & Ln ) { return Inc< LnT, LnA, LnP> ( Ln, 1 ) ; }
LnP & Inc ( LnT & Ln, int N ) {
return Inc< LnT, LnA, LnP> ( Ln, N ) ; }
TbP & Inc ( TbT & Tb ) { return Inc< TbT, TbA, TbP> ( Tb, -1 ) ; }
SrP & Inc ( SrT & Sr ) { return Inc< SrT, SrA, SrP> ( Sr, -1 ) ; }
GyP & Inc ( GyT & Gy ) { return Inc< GyT, GyA, GyP> ( Gy, -1 ) ; }
....................
// #include "Debug.CPP"
// This is the sole ??? WNDPROC ???:
long __stdcall WinProc ( HWND Wnd, uint _WM, uint C, long C2 ) {
PostMessage( Win, _WM, C, C2 ); return 1 ; }
#define IncY ShowCursor( 1 )
#define DecY ShowCursor( 0 )
SetCur( int X ) { int Y = DecY ;
if ( Y > X ) while ( DecY > X );
else if ( Y < X ) while ( IncY < X ); }
#define WantsOut ( \
WM == WM_APPCOMMAND && P_C2[ 1 ] == APPCOMMAND_CLOSE \
|| WM == WM_SYSKEYDOWN && C == VK_F4 \
|| WM == WM_KEYDOWN && ( C == 27 || C == VK_F4 ) )
const int Any = 1, Spun = 0; MSG Msg;
int Getting( int TheGirl ) { static int OnStage = -1, WasInX, rv ;
static double PaintAlarm ;
Wheel_Flip = OnUp = OnDwn = OnLD = OnMD = 0 ;
OnRD = OnLU = OnMU = OnRU = WM = C = C2 = 0 ;
GetCursorPos( & XY );
int MouseX = XY.x
, MouseY = XY.y, InX = MouseY >= ScrTop && MouseY <= ScrBot ;
if ( PeekMessage( & Msg, 0,0,0, PM_REMOVE ) ) {
WM = Msg.message, C = Msg.wParam, C2 = Msg.lParam, Mouse();
if ( WantsOut ) exit( 1 );
if ( WM == WM_PAINT ) ValidateRect( Win, & WinRecL );
if ( ! OnStage && WM == WM_SYNCPAINT )
ShowWindow( Win, SW_SHOWMINNOACTIVE );
if ( WM == WM_ACTIVATEAPP ) {
rv = OnStage == -1, PaintReq |= ( OnStage = C );
if ( ! rv && OnStage ) { _SurT Was = 0, Is ;
if ( ! WinSur ) exit( 1 );
ShowWindow( Win, SW_SHOWNOACTIVATE ); WinSur->Restore();
DrawSur->Restore(), Cursor->Restore(), DrawCursor();
LoopXx( Gy, Gy ) { CharSurT * S = P->CharSur -1 ;
Loop( Colors )
if ( Is = ( ++ S )->Cached ) {
if ( Is != Was ) Is->Restore(), Was = Is ;
_CacheGlyph( P, J, Is, S->I ); } } } }
// ShWM
}
if ( Secs < PaintAlarm || ! OnStage
|| ! PaintReq && ! ( WasInX && ! InX ) ) {
Done:
int GotIt = TheGirl <= Any && WM || TheGirl > Any && WM == TheGirl ;
if ( TheGirl == Any && ! OnUp && ButUp )
ButUp = 0, ButDwn = ButDwnE = 0, PaintReq = 1 ;
else if ( ! GotIt && TheGirl != Spun ) Sleep( 999 / 70. );
return GotIt ; }
WasInX = InX, PaintAlarm = _Secs + 1 / 70.;
DrawSur->Blt( & WinRecL, 0,0, DDBLT_ROP, & ErBlack );
if ( BarB ) { LnP P = BarB ; int Ch, Ch2 ; Col = 0, Row = 0 ;
While ( Ch ) {
PrnChar( _Gy( Ch > 32 ? '_' : 32 ), & Hues.Default_Color ), Col -- ;
PrnChar( _Gy( Ch )
, P < ButDwn || P >= ButDwnE
? & Hues.Bar_Color
: ButUp ? & Hues.NewColor : & Hues.Yellow ); } }
if ( Ln.BB && VisLn >= 0 ) { LnA PP = Ln.BB + VisLn - 1 ;
Loop( ScrRows ) { if ( ++ PP > Ln.PP ) break;
if ( ! * PP ) continue ; Row = J + 1 , Col = 0 ;
int OverRide_Color = 0 ;
int Row_Selected = First_Sel && J == J_Sel - VisLn ;
const ulong * Color = & Hues.Default_Color ; LnP P = * PP - 1 ;
Next_Ch: wchar_t Ch = * ++ P ;
switch ( Ch ) {
case 0: case 13: case 10: continue;
case Ch_Coloring:
OverRide_Color = 0 , Color = & Hues.Default_Color ;
goto Next_Ch ;
case Ch_Default:
OverRide_Color = 1 , Color = & Hues.Default_Color ;
goto Next_Ch ;
case Ch_New: OverRide_Color = 1 , Color = & Hues.NewColor ;
goto Next_Ch ;
case ChOdd: OverRide_Color = 1 , Color = & Hues.OddColor ;
goto Next_Ch ;
case ChYell: OverRide_Color = 1 , Color = & Hues.Yellow ;
goto Next_Ch ;
default: GyP _Ch = _Gy( Ch );
PrnChar( _Ch,
Row_Selected && P >= BSel && P <= ESel
? & Hues.Sel_Color
: Ch < 32 || _Ch->Blank
? & Hues.Bin_Color
: OverRide_Color
? Color
: IsDigit( Ch )
? & Hues.Num_Color
: _Ch->ColsCh == Dub
? & Hues.OddColor
: Iden( Ch ) ? Color : & Hues.Bin_Color );
goto Next_Ch ; } } }
SetCur( - InX );
if ( InX )
Fast_Paint(
Cursor, CursorRec , _R( MouseX - ScrLeft
, MouseY - ScrTop, Cur_Pix, Cur_Pix ) );
if ( GetForegroundWindow() == Win )
WinSur->Blt( & WinRecG, DrawSur, 0, DDBLT_DDFX, & VSync );
PaintReq = 0; goto Done ; }
// ShBot() ensures that the last printed line is visible.
ShBot() {
VisLn = ER ( 0, Ln.PP - Ln.BB - ScrRows + 2 ), PaintReq = 1 ; }
int _Sh ( LnP B ) { LnP P = B, E ; int Ch, Ch2, Two = -1, Len ;
While ( ! CRLF ); E = P ; While ( CRLF ) if ( Ch == 10 ) Two ++ ;
* E = 0, Len = 1 + E - B ;
wmemmove ( Inc ( Ln ) = MallocTmp ( Len * SzChar ), B, Len );
ShBot();
if ( Two > 0 ) P -- ; return ! * P ? -- Len : _Sh ( P ); }
// Sh() prints a line to a Maximized_Window/Primary_Surface.
#define Printed ( \
Sz_Sh = Str_Stk ( B_Sh, Max_Sh - 3, S, ( __LnP ) & S + SzPtr ) )
#define Sh_Silent \
while ( Printed < 0 ) B_Sh = MallocTmp( Max_Sh *= 2 );
int Max_Sh, Sz_Sh ; LnP B_Sh ;
int Sh ( LnP S, ... ) { Sh_Silent return _Sh( B_Sh ); }
....................
SwitchHeap() { Zero( Ls ), Zero( Ag ), Zero( Path ), Zero( Us );
LnT _Ln = Ln ; Zero( Ln ); HANDLE H = Heap ; NewHeap;
LoopXx ( Ln, _Ln ) if ( P ) Sh( L"%s", P );
VisLn = 0 ; HeapDestroy( H ); }