From beab403d9fcf1fb41f3c133fc6d58e1e864a8d56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Nowacki?= Date: Fri, 10 Feb 2012 09:14:41 +0100 Subject: [PATCH] Reduce QtCore lib binary size by around ~3KB, by removing template code Reusing a template is much better then creating a new one, even if it should inline the same code. For some reason replacing T* by void* force gcc to remove a few bytes per template instantiation too, it is not really significant, but it alows us to simplify the code. Benchmarks don't show any regressions. Change-Id: I4fdf1e4dc311b23021eb5758605602937d05b183 Reviewed-by: Bradley T. Hughes Reviewed-by: Thiago Macieira --- src/corelib/kernel/qmetatype.cpp | 8 +-- src/corelib/kernel/qmetatype.h | 74 +++++++++------------- src/corelib/kernel/qmetatype_p.h | 47 ++------------ tests/auto/other/compiler/tst_compiler.cpp | 4 +- 4 files changed, 42 insertions(+), 91 deletions(-) diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp index 0021c0ced2..003ad1c32d 100644 --- a/src/corelib/kernel/qmetatype.cpp +++ b/src/corelib/kernel/qmetatype.cpp @@ -1290,7 +1290,7 @@ namespace { class TypeDestroyer { template::IsAccepted> struct DestroyerImpl { - static void Destroy(const int /* type */, T *where) { delete where; } + static void Destroy(const int /* type */, void *where) { qMetaTypeDeleteHelper(where); } }; template struct DestroyerImpl { @@ -1354,11 +1354,11 @@ namespace { class TypeConstructor { template::IsAccepted> struct ConstructorImpl { - static void *Construct(const int /*type*/, void *where, const T *copy) { return qMetaTypeConstructHelper(where, copy); } + static void *Construct(const int /*type*/, void *where, const void *copy) { return qMetaTypeConstructHelper(where, copy); } }; template struct ConstructorImpl { - static void *Construct(const int type, void *where, const T *copy) + static void *Construct(const int type, void *where, const void *copy) { if (QTypeModuleInfo::IsGui) return Q_LIKELY(qMetaTypeGuiHelper) ? qMetaTypeGuiHelper[type - QMetaType::FirstGuiType].constructor(where, copy) : 0; @@ -1440,7 +1440,7 @@ namespace { class TypeDestructor { template::IsAccepted> struct DestructorImpl { - static void Destruct(const int /* type */, T *where) { qMetaTypeDestructHelper(where); } + static void Destruct(const int /* type */, void *where) { qMetaTypeDestructHelper(where); } }; template struct DestructorImpl { diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index 4af77fcedc..4e75e1414b 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -318,46 +318,57 @@ private: Q_DECLARE_OPERATORS_FOR_FLAGS(QMetaType::TypeFlags) template -void qMetaTypeDeleteHelper(T *t) +void qMetaTypeDeleteHelper(void *t) { - delete t; + delete static_cast(t); } +template <> inline void qMetaTypeDeleteHelper(void *) {} template -void *qMetaTypeCreateHelper(const T *t) +void *qMetaTypeCreateHelper(const void *t) { if (t) return new T(*static_cast(t)); return new T(); } -template -void qMetaTypeDestructHelper(T *t) -{ - Q_UNUSED(t) // Silence MSVC that warns for POD types. - t->~T(); -} +template <> inline void *qMetaTypeCreateHelper(const void *) { return 0; } template -void *qMetaTypeConstructHelper(void *where, const T *t) +void qMetaTypeDestructHelper(void *t) +{ + Q_UNUSED(t) // Silence MSVC that warns for POD types. + static_cast(t)->~T(); +} + +template <> inline void qMetaTypeDestructHelper(void *) {} + +template +void *qMetaTypeConstructHelper(void *where, const void *t) { if (t) return new (where) T(*static_cast(t)); return new (where) T; } +template <> inline void *qMetaTypeConstructHelper(void *, const void *) { return 0; } + #ifndef QT_NO_DATASTREAM template -void qMetaTypeSaveHelper(QDataStream &stream, const T *t) +void qMetaTypeSaveHelper(QDataStream &stream, const void *t) { - stream << *t; + stream << *static_cast(t); } +template <> inline void qMetaTypeSaveHelper(QDataStream &, const void *) {} + template -void qMetaTypeLoadHelper(QDataStream &stream, T *t) +void qMetaTypeLoadHelper(QDataStream &stream, void *t) { - stream >> *t; + stream >> *static_cast(t); } + +template <> inline void qMetaTypeLoadHelper(QDataStream &, void *) {} #endif // QT_NO_DATASTREAM template @@ -442,15 +453,6 @@ int qRegisterMetaType(const char *typeName if (typedefOf != -1) return QMetaType::registerTypedef(typeName, typedefOf); - typedef void*(*CreatePtr)(const T*); - CreatePtr cptr = qMetaTypeCreateHelper; - typedef void(*DeletePtr)(T*); - DeletePtr dptr = qMetaTypeDeleteHelper; - typedef void*(*ConstructPtr)(void *, const T*); - ConstructPtr ipcptr = qMetaTypeConstructHelper; - typedef void(*DestructPtr)(T*); - DestructPtr ipdptr = qMetaTypeDestructHelper; - QMetaType::TypeFlags flags; if (!QTypeInfo::isStatic) flags |= QMetaType::MovableType; @@ -461,10 +463,10 @@ int qRegisterMetaType(const char *typeName if (QtPrivate::IsPointerToTypeDerivedFromQObject::Value) flags |= QMetaType::PointerToQObject; - return QMetaType::registerType(typeName, reinterpret_cast(dptr), - reinterpret_cast(cptr), - reinterpret_cast(ipdptr), - reinterpret_cast(ipcptr), + return QMetaType::registerType(typeName, qMetaTypeDeleteHelper, + qMetaTypeCreateHelper, + qMetaTypeDestructHelper, + qMetaTypeConstructHelper, sizeof(T), flags); } @@ -477,14 +479,8 @@ void qRegisterMetaTypeStreamOperators(const char *typeName #endif ) { - typedef void(*SavePtr)(QDataStream &, const T *); - typedef void(*LoadPtr)(QDataStream &, T *); - SavePtr sptr = qMetaTypeSaveHelper; - LoadPtr lptr = qMetaTypeLoadHelper; - qRegisterMetaType(typeName); - QMetaType::registerStreamOperators(typeName, reinterpret_cast(sptr), - reinterpret_cast(lptr)); + QMetaType::registerStreamOperators(typeName, qMetaTypeSaveHelper, qMetaTypeLoadHelper); } #endif // QT_NO_DATASTREAM @@ -516,16 +512,8 @@ inline int qRegisterMetaType( template inline int qRegisterMetaTypeStreamOperators() { - typedef void(*SavePtr)(QDataStream &, const T *); - typedef void(*LoadPtr)(QDataStream &, T *); - SavePtr sptr = qMetaTypeSaveHelper; - LoadPtr lptr = qMetaTypeLoadHelper; - register int id = qMetaTypeId(); - QMetaType::registerStreamOperators(id, - reinterpret_cast(sptr), - reinterpret_cast(lptr)); - + QMetaType::registerStreamOperators(id, qMetaTypeSaveHelper, qMetaTypeLoadHelper); return id; } #endif diff --git a/src/corelib/kernel/qmetatype_p.h b/src/corelib/kernel/qmetatype_p.h index e48c5d3033..b50521c7a6 100644 --- a/src/corelib/kernel/qmetatype_p.h +++ b/src/corelib/kernel/qmetatype_p.h @@ -122,31 +122,6 @@ QT_FOR_EACH_STATIC_WIDGETS_CLASS(QT_DECLARE_WIDGETS_MODULE_TYPES_ITER) class QMetaTypeInterface { public: - template - struct Impl { - static void *creator(const T *t) - { - if (t) - return new T(*t); - return new T(); - } - - static void deleter(T *t) { delete t; } - static void saver(QDataStream &stream, const T *t) { stream << *t; } - static void loader(QDataStream &stream, T *t) { stream >> *t; } - static void destructor(T *t) - { - Q_UNUSED(t) // Silence MSVC that warns for POD types. - t->~T(); - } - static void *constructor(void *where, const T *t) - { - if (t) - return new (where) T(*static_cast(t)); - return new (where) T; - } - }; - QMetaType::Creator creator; QMetaType::Deleter deleter; QMetaType::SaveOperator saveOp; @@ -157,20 +132,10 @@ public: quint32 flags; // same as QMetaType::TypeFlags }; -template<> -struct QMetaTypeInterface::Impl { - static void *creator(const void *) { return 0; } - static void deleter(void *) {} - static void saver(QDataStream &, const void *) {} - static void loader(QDataStream &, void *) {} - static void destructor(void *){} - static void *constructor(void *, const void *) { return 0; } -}; - #ifndef QT_NO_DATASTREAM # define QT_METATYPE_INTERFACE_INIT_DATASTREAM_IMPL(Type) \ - /*saveOp*/(reinterpret_cast(QMetaTypeInterface::Impl::saver)), \ - /*loadOp*/(reinterpret_cast(QMetaTypeInterface::Impl::loader)), + /*saveOp*/(qMetaTypeSaveHelper), \ + /*loadOp*/(qMetaTypeLoadHelper), # define QT_METATYPE_INTERFACE_INIT_EMPTY_DATASTREAM_IMPL(Type) \ /*saveOp*/ 0, \ /*loadOp*/ 0, @@ -184,11 +149,11 @@ struct QMetaTypeInterface::Impl { #define QT_METATYPE_INTERFACE_INIT_IMPL(Type, DATASTREAM_DELEGATE) \ { \ - /*creator*/(reinterpret_cast(QMetaTypeInterface::Impl::creator)), \ - /*deleter*/(reinterpret_cast(QMetaTypeInterface::Impl::deleter)), \ + /*creator*/(qMetaTypeCreateHelper), \ + /*deleter*/(qMetaTypeDeleteHelper), \ DATASTREAM_DELEGATE(Type) \ - /*constructor*/(reinterpret_cast(QMetaTypeInterface::Impl::constructor)), \ - /*destructor*/(reinterpret_cast(QMetaTypeInterface::Impl::destructor)), \ + /*constructor*/(qMetaTypeConstructHelper), \ + /*destructor*/(qMetaTypeDestructHelper), \ /*size*/(QTypeInfo::sizeOf), \ /*flags*/(!QTypeInfo::isStatic * QMetaType::MovableType) \ | (QTypeInfo::isComplex * QMetaType::NeedsConstruction) \ diff --git a/tests/auto/other/compiler/tst_compiler.cpp b/tests/auto/other/compiler/tst_compiler.cpp index 43e3788098..d72a04c8aa 100644 --- a/tests/auto/other/compiler/tst_compiler.cpp +++ b/tests/auto/other/compiler/tst_compiler.cpp @@ -268,9 +268,7 @@ namespace QtTestInternal struct Getter { static QMetaType::SaveOperator saveOp() { - typedef void(*SavePtr)(QDataStream &, const T *); - SavePtr op = ::qMetaTypeSaveHelper; - return reinterpret_cast(op); + return ::qMetaTypeSaveHelper; } };