33#include " _types.h"
44
55#include " tbb/tbb_allocator.h"
6+ #include " tbb/scalable_allocator.h"
7+
8+ /*
9+ Можно заключить - прокси перехватывает не всегда и/или не всё используемые функции.
10+ И в очень малом количестве случаев это приводит к странностям при работе с памятью.
11+ Поэтому всё-же стоит переопределять для большинства случаев операторы new и delete.
12+ А для остального мы будем полагать (и надеяться), что прокси справится без проблем.
13+ */
614#include " tbb/tbbmalloc_proxy.h"
715
816class XRCORE_API xrMemory
@@ -16,10 +24,10 @@ class XRCORE_API xrMemory
1624
1725public:
1826 size_t mem_usage ();
19- void mem_compact ();
20- void * mem_alloc (size_t size);
21- void * mem_realloc (void * p, const size_t size);
22- void mem_free (void * p) ;
27+ void mem_compact ();
28+ inline void * mem_alloc (size_t size) { stat_calls++; return scalable_malloc ( size); } ;
29+ inline void * mem_realloc (void * ptr, size_t size) { stat_calls++; return scalable_realloc (ptr, size); } ;
30+ inline void mem_free (void * ptr) { stat_calls++; scalable_free (ptr); } ;
2331};
2432
2533extern XRCORE_API xrMemory Memory;
@@ -31,29 +39,44 @@ extern XRCORE_API xrMemory Memory;
3139#define CopyMemory (a, b, c ) memcpy(a, b, c)
3240#define FillMemory (a, b, c ) memset(a, c, b)
3341
34- #define xr_delete (x )\
35- {\
36- delete (x);\
37- (x) = nullptr ;\
42+ /*
43+ Начиная со стандарта C++11 нет необходимости объявлять все формы операторов new и delete.
44+ */
45+
46+ inline void * operator new (size_t size)
47+ {
48+ return Memory.mem_alloc (size);
3849}
3950
40- // generic "C"-like allocations/deallocations
41- template < class T >
42- T* xr_alloc ( const size_t count)
43- { return (T*)Memory. mem_alloc (count * sizeof (T)); }
51+ inline void operator delete ( void * ptr) noexcept
52+ {
53+ Memory. mem_free (ptr);
54+ }
4455
56+ template <class T >
57+ inline void xr_delete (T*& ptr) noexcept
58+ {
59+ delete ptr;
60+ ptr = nullptr ;
61+ }
4562
63+ // generic "C"-like allocations/deallocations
64+ template <class T >
65+ inline T* xr_alloc (size_t count)
66+ {
67+ return (T*)Memory.mem_alloc (count * sizeof (T));
68+ }
4669template <class T >
47- void xr_free (T*& P ) noexcept
70+ inline void xr_free (T*& ptr ) noexcept
4871{
49- if (P )
72+ if (ptr )
5073 {
51- Memory.mem_free ((void *)P );
52- P = nullptr ;
74+ Memory.mem_free ((void *)ptr );
75+ ptr = nullptr ;
5376 }
5477}
55- inline void * xr_malloc ( const size_t size) { return Memory.mem_alloc (size); }
56- inline void * xr_realloc (void * P, const size_t size) { return Memory.mem_realloc (P , size); }
78+ inline void * xr_malloc ( size_t size) { return Memory.mem_alloc (size); }
79+ inline void * xr_realloc (void * ptr, size_t size) { return Memory.mem_realloc (ptr , size); }
5780
5881XRCORE_API pstr xr_strdup (pcstr string);
5982
0 commit comments