diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2019-01-04 15:09:05 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-04 15:09:05 +0100 |
commit | 578c6316c884cd136c9d9de94f1ba20468e4737a (patch) | |
tree | 69e89083332574d051ccebadef64ae296316f902 /core/os/memory.h | |
parent | fa5ca1bbf0451017f388c660cd06bd141eb762b6 (diff) | |
parent | 4240e3d668be01a8497747b542279041a64a11cd (diff) | |
download | redot-engine-578c6316c884cd136c9d9de94f1ba20468e4737a.tar.gz |
Merge pull request #24732 from hpvb/vector-pod-optimization
Optimizations for trivial types
Diffstat (limited to 'core/os/memory.h')
-rw-r--r-- | core/os/memory.h | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/core/os/memory.h b/core/os/memory.h index 558dc5ddf3..f3ca9fc614 100644 --- a/core/os/memory.h +++ b/core/os/memory.h @@ -116,7 +116,9 @@ void memdelete(T *p_class) { if (!predelete_handler(p_class)) return; // doesn't want to be deleted - p_class->~T(); + if (!__has_trivial_destructor(T)) + p_class->~T(); + Memory::free_static(p_class, false); } @@ -125,7 +127,9 @@ void memdelete_allocator(T *p_class) { if (!predelete_handler(p_class)) return; // doesn't want to be deleted - p_class->~T(); + if (!__has_trivial_destructor(T)) + p_class->~T(); + A::free(p_class); } @@ -150,11 +154,13 @@ T *memnew_arr_template(size_t p_elements, const char *p_descr = "") { ERR_FAIL_COND_V(!mem, failptr); *(mem - 1) = p_elements; - T *elems = (T *)mem; + if (!__has_trivial_constructor(T)) { + T *elems = (T *)mem; - /* call operator new */ - for (size_t i = 0; i < p_elements; i++) { - new (&elems[i], sizeof(T), p_descr) T; + /* call operator new */ + for (size_t i = 0; i < p_elements; i++) { + new (&elems[i], sizeof(T), p_descr) T; + } } return (T *)mem; @@ -177,12 +183,14 @@ void memdelete_arr(T *p_class) { uint64_t *ptr = (uint64_t *)p_class; - uint64_t elem_count = *(ptr - 1); + if (!__has_trivial_destructor(T)) { + uint64_t elem_count = *(ptr - 1); - for (uint64_t i = 0; i < elem_count; i++) { + for (uint64_t i = 0; i < elem_count; i++) { + p_class[i].~T(); + } + } - p_class[i].~T(); - }; Memory::free_static(ptr, true); } |