[Bf-blender-cvs] [92a3a4e0290] functions: speedup when all types in tuple meta are trivially destructible
Jacques Lucke
noreply at git.blender.org
Mon May 20 09:51:43 CEST 2019
Commit: 92a3a4e029094ffe5934c7508d0c2050ad193675
Author: Jacques Lucke
Date: Mon May 20 09:51:33 2019 +0200
Branches: functions
https://developer.blender.org/rB92a3a4e029094ffe5934c7508d0c2050ad193675
speedup when all types in tuple meta are trivially destructible
===================================================================
M source/blender/functions/backends/tuple_call/cpp_types.hpp
M source/blender/functions/backends/tuple_call/tuple.hpp
===================================================================
diff --git a/source/blender/functions/backends/tuple_call/cpp_types.hpp b/source/blender/functions/backends/tuple_call/cpp_types.hpp
index 30070b0b571..4130264a424 100644
--- a/source/blender/functions/backends/tuple_call/cpp_types.hpp
+++ b/source/blender/functions/backends/tuple_call/cpp_types.hpp
@@ -19,41 +19,43 @@ class CPPTypeInfo : public TypeExtension {
virtual void copy_to_uninitialized(void *src, void *dst) const = 0;
virtual void relocate_to_initialized(void *src, void *dst) const = 0;
virtual void relocate_to_uninitialized(void *src, void *dst) const = 0;
+
+ virtual bool trivially_destructible() const = 0;
};
template<typename T> class CPPTypeInfoForType : public CPPTypeInfo {
public:
- virtual uint size_of_type() const override
+ uint size_of_type() const override
{
return sizeof(T);
}
- virtual void construct_default(void *ptr) const override
+ void construct_default(void *ptr) const override
{
new (ptr) T();
}
- virtual void destruct_type(void *ptr) const override
+ void destruct_type(void *ptr) const override
{
T *ptr_ = (T *)ptr;
ptr_->~T();
}
- virtual void copy_to_initialized(void *src, void *dst) const override
+ void copy_to_initialized(void *src, void *dst) const override
{
T *dst_ = (T *)dst;
T *src_ = (T *)src;
std::copy(src_, src_ + 1, dst_);
}
- virtual void copy_to_uninitialized(void *src, void *dst) const override
+ void copy_to_uninitialized(void *src, void *dst) const override
{
T *dst_ = (T *)dst;
T *src_ = (T *)src;
std::uninitialized_copy(src_, src_ + 1, dst_);
}
- virtual void relocate_to_initialized(void *src, void *dst) const override
+ void relocate_to_initialized(void *src, void *dst) const override
{
T *dst_ = (T *)dst;
T *src_ = (T *)src;
@@ -61,7 +63,7 @@ template<typename T> class CPPTypeInfoForType : public CPPTypeInfo {
src_->~T();
}
- virtual void relocate_to_uninitialized(void *src, void *dst) const override
+ void relocate_to_uninitialized(void *src, void *dst) const override
{
T *dst_ = (T *)dst;
T *src_ = (T *)src;
@@ -69,6 +71,11 @@ template<typename T> class CPPTypeInfoForType : public CPPTypeInfo {
std::make_move_iterator(src_), std::make_move_iterator(src_ + 1), dst_);
src_->~T();
}
+
+ bool trivially_destructible() const override
+ {
+ return std::is_trivially_destructible<T>::value;
+ }
};
} /* namespace FN */
diff --git a/source/blender/functions/backends/tuple_call/tuple.hpp b/source/blender/functions/backends/tuple_call/tuple.hpp
index 42f4cc5edb3..5955eb19ded 100644
--- a/source/blender/functions/backends/tuple_call/tuple.hpp
+++ b/source/blender/functions/backends/tuple_call/tuple.hpp
@@ -11,16 +11,21 @@ class TupleMeta : public RefCountedBase {
SmallVector<uint> m_offsets;
uint m_size__data;
uint m_size__data_and_init;
+ bool m_all_trivially_destructible;
public:
TupleMeta(ArrayRef<SharedType> types = {}) : m_types(types.to_small_vector())
{
+ m_all_trivially_destructible = true;
m_size__data = 0;
for (const SharedType &type : types) {
CPPTypeInfo *info = type->extension<CPPTypeInfo>();
m_offsets.append(m_size__data);
m_type_info.append(info);
m_size__data += info->size_of_type();
+ if (!info->trivially_destructible()) {
+ m_all_trivially_destructible = false;
+ }
}
m_offsets.append(m_size__data);
@@ -68,6 +73,11 @@ class TupleMeta : public RefCountedBase {
{
return m_offsets[index + 1] - m_offsets[index];
}
+
+ bool all_trivially_destructible() const
+ {
+ return m_all_trivially_destructible;
+ }
};
using SharedTupleMeta = AutoRefCount<TupleMeta>;
@@ -367,10 +377,15 @@ class Tuple {
void destruct_all()
{
- for (uint i = 0; i < m_meta->element_amount(); i++) {
- if (m_initialized[i]) {
- m_meta->type_infos()[i]->destruct_type(this->element_ptr(i));
- m_initialized[i] = false;
+ if (m_meta->all_trivially_destructible()) {
+ this->set_all_uninitialized();
+ }
+ else {
+ for (uint i = 0; i < m_meta->element_amount(); i++) {
+ if (m_initialized[i]) {
+ m_meta->type_infos()[i]->destruct_type(this->element_ptr(i));
+ m_initialized[i] = false;
+ }
}
}
}
More information about the Bf-blender-cvs
mailing list