Optimize code in QTaggedPointer
Don't execute instructions that will never do anything. Directly add the tag to the pointer in the constructor to avoid additional masking operations, and avoid a masking op that is in practice a no-op in setTag(). Do the same optimization in QTagPreservingPointerToPointer. Change-Id: Ia364f89cbe6ccc876ec9bda0c239fc4f57c10501 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> (cherry picked from commit 2721728c9056b442c0281f20792f19eb6a491aa0) Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>bb10
parent
de4a73ebd6
commit
1181286d43
|
|
@ -283,7 +283,7 @@ public:
|
|||
|
||||
void setPointer(T *ptr)
|
||||
{
|
||||
*d = (reinterpret_cast<quintptr>(ptr) & QTaggedPointer<T, Tag>::pointerMask()) | (*d & QTaggedPointer<T, Tag>::tagMask());
|
||||
*d = reinterpret_cast<quintptr>(ptr) | (*d & QTaggedPointer<T, Tag>::tagMask());
|
||||
}
|
||||
|
||||
T *get() const
|
||||
|
|
|
|||
|
|
@ -83,14 +83,13 @@ public:
|
|||
constexpr QTaggedPointer(std::nullptr_t) noexcept : QTaggedPointer() {}
|
||||
|
||||
explicit QTaggedPointer(T *pointer, Tag tag = Tag()) noexcept
|
||||
: d(quintptr(pointer))
|
||||
: d(quintptr(pointer) | quintptr(tag))
|
||||
{
|
||||
static_assert(sizeof(Type*) == sizeof(QTaggedPointer));
|
||||
|
||||
Q_ASSERT_X((quintptr(pointer) & tagMask()) == 0,
|
||||
"QTaggedPointer<T, Tag>", "Pointer is not aligned");
|
||||
|
||||
setTag(tag);
|
||||
Q_ASSERT_X((quintptr(pointer) & tagMask()) == 0, "QTaggedPointer<T, Tag>", "Pointer is not aligned");
|
||||
Q_ASSERT_X((static_cast<typename QtPrivate::TagInfo<T>::TagType>(tag) & pointerMask()) == 0,
|
||||
"QTaggedPointer<T, Tag>::setTag", "Tag is larger than allowed by number of available tag bits");
|
||||
}
|
||||
|
||||
Type &operator*() const noexcept
|
||||
|
|
@ -125,7 +124,7 @@ public:
|
|||
Q_ASSERT_X((static_cast<typename QtPrivate::TagInfo<T>::TagType>(tag) & pointerMask()) == 0,
|
||||
"QTaggedPointer<T, Tag>::setTag", "Tag is larger than allowed by number of available tag bits");
|
||||
|
||||
d = (d & pointerMask()) | (static_cast<typename QtPrivate::TagInfo<T>::TagType>(tag) & tagMask());
|
||||
d = (d & pointerMask()) | static_cast<quintptr>(tag);
|
||||
}
|
||||
|
||||
Tag tag() const noexcept
|
||||
|
|
|
|||
Loading…
Reference in New Issue