/* exarray.cpp A template of dynamic arrays with automatic check of an index. Memory allocation functions (minimal edition). (C) R.N.Shakirov, IMach of RAS (UB), 1998 - 2000 All Rights Reserved. /* #include <malloc.h> #include <string.h> #include <stdlib.h> // Function exmrealloc allocates, // reallocates and frees zero filled // memory blocks. void exmrealloc (void **p, unsigned size, unsigned oldsize) { if (size) // Allocation. { if (size > (~0u)-9) abort(); // Size range error if ((*p = realloc (*p, size))==NULL) abort(); // Allocation error if (size > oldsize) // Zero filling memset ((char*)*p+oldsize, 0, size-oldsize); } else // Freeing. { if (*p) { free (*p); *p = NULL; } } } // Function excalcsize computes size of // memory block (in bytes) not less then required. // For this purpose SIZE_MOD multiplies by 2 and 1.5. // On unsigned int overflow excalcsize returns ~0u. // For less fragmentation the system header size // SIZE_SYS is taken into account. // For L1 Pentium cache optimization SIZE_MOD // sets as 64**n +/- 16. #define SIZE_MOD (112) #define SIZE_SYS (sizeof(int) * 2) unsigned excalcsize (unsigned size) { unsigned n = SIZE_MOD, k = 0; for (;; k = ~k, (k? (n <<= 1): (n += (n >> 1)))) { n -= SIZE_SYS; if (n >= size) break; n += SIZE_SYS; if ((int)n < 0) { n =~0u; break; } } return (n); }