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. Pick-to: dev Change-Id: Ia364f89cbe6ccc876ec9bda0c239fc4f57c10501 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
This commit is contained in:
parent
98c82fb445
commit
2721728c90
@ -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…
x
Reference in New Issue
Block a user