3
3
#include " _types.h"
4
4
5
5
#include " tbb/tbb_allocator.h"
6
+ #include " tbb/scalable_allocator.h"
7
+
8
+ /*
9
+ Можно заключить - прокси перехватывает не всегда и/или не всё используемые функции.
10
+ И в очень малом количестве случаев это приводит к странностям при работе с памятью.
11
+ Поэтому всё-же стоит переопределять для большинства случаев операторы new и delete.
12
+ А для остального мы будем полагать (и надеяться), что прокси справится без проблем.
13
+ */
6
14
#include " tbb/tbbmalloc_proxy.h"
7
15
8
16
class XRCORE_API xrMemory
@@ -16,10 +24,10 @@ class XRCORE_API xrMemory
16
24
17
25
public:
18
26
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); } ;
23
31
};
24
32
25
33
extern XRCORE_API xrMemory Memory;
@@ -31,29 +39,44 @@ extern XRCORE_API xrMemory Memory;
31
39
#define CopyMemory (a, b, c ) memcpy(a, b, c)
32
40
#define FillMemory (a, b, c ) memset(a, c, b)
33
41
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);
38
49
}
39
50
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
+ }
44
55
56
+ template <class T >
57
+ inline void xr_delete (T*& ptr) noexcept
58
+ {
59
+ delete ptr;
60
+ ptr = nullptr ;
61
+ }
45
62
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
+ }
46
69
template <class T >
47
- void xr_free (T*& P ) noexcept
70
+ inline void xr_free (T*& ptr ) noexcept
48
71
{
49
- if (P )
72
+ if (ptr )
50
73
{
51
- Memory.mem_free ((void *)P );
52
- P = nullptr ;
74
+ Memory.mem_free ((void *)ptr );
75
+ ptr = nullptr ;
53
76
}
54
77
}
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); }
57
80
58
81
XRCORE_API pstr xr_strdup (pcstr string);
59
82
0 commit comments