有关 Qt 变量指针的存储

chen_freecom 2013-07-02 10:30:49
经常看到Qt存储一个变量的步骤, 如QReadLocker:
1.定义成员变量 quintptr q_val;
2.构造函数中
QReadLocker::QReadLocker(QReadWriteLock *areadWriteLock)
: q_val(reinterpret_cast<quintptr>(areadWriteLock))
{
Q_ASSERT_X((q_val & quintptr(1u)) == quintptr(0),
"QReadLocker", "QReadWriteLock pointer is misaligned");
relock();
}
3.inline void relock()
{
if (q_val) {
if ((q_val & quintptr(1u)) == quintptr(0u)) {
readWriteLock()->lockForRead();
q_val |= quintptr(1u);
}
}
}
4.inline void unlock()
{
if (q_val) {
if ((q_val & quintptr(1u)) == quintptr(1u)) {
q_val &= ~quintptr(1u);
readWriteLock()->unlock();
}
}
}
------------------------------------
问题是 为什么要对q_val做这种处理?有什么好处?
...全文
187 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
Qt源码剖析-智能指针 ⽬录 智能指针是什么? 智能指针是什么? 1. 智能指针是使⽤RAII技术(惯⽤⼿法)对裸指针进⾏封装、隔离、管理。 2. 把堆对象转移为栈对象。 为什么使⽤ 为什么使⽤QT智能 智能(smart)指针指针? CPP中在使⽤堆内存时我们必须使⽤指针,使⽤指针给我带来便利和强⼤的威⼒同时也给我们带来了很多隐患,所以指针也是把双刃剑。 常见的隐患有: 1. 我们在使⽤new创建⼀个对象的同时,由于种种原因⽽忘记了delete从⽽导致内存泄漏影响应⽤运⾏效率 2. 我们在使⽤⼀个指针的时候不知道该指针指向的对象是否已经析构,从⽽导致使⽤⼀个错误的野指针。 针对上述问题Qt提供⼀组类模板(Smart指针类)来管理C++中的裸指针, 同时提供相关重载运算符使得使⽤起来与指针操作⽆异。 指针的⽣ 命周期也交由Smart类来管理⽽不⽤程序员⾃⼰去⼿动管理。使⽤Smart指针进⽽避免了上述隐患的存在。 Qt提供了哪些智能指针? 提供了哪些智能指针? QPointer、QSharedPointer、QScopedPointer、QWeakPointer、QSharedDataPointer、QExplicitlySharedDataPointer、 QGuard、QtPatternist::AutoPtr 由于Qt智能指针较多,避免篇幅较长本⽂只对平时使⽤场景较多的QSharedPointer源码进⾏分析也⽐较有代表性 QSharedPointer 官⽅介绍: QSharedPointer类持有对共享指针的强引⽤。QSharedPointer是c++中的⼀个⾃动共享指针。它的⾏为与⽤于普通⽬的的普通指针完全 相同,包括对constness的尊重。当指针超出作⽤域时,QSharedPointer将删除它所持有的指针,前提是没有其他QSharedPointer对象 引⽤它。QSharedPointer对象可以从普通指针、另⼀个QSharedPointer对象或通过将QWeakPointer对象提升为强引⽤来创建。 本⽂基于Qt5.12.4版本分析 QSharedPointer类模板 类模板(smart指针指针类)源码分析 源码分析 QSharedPointer类源码篇幅较长,避免出现阅读疲劳以下分段解读。 1. QSharedPointer类模板对于模板参数 类模板对于模板参数T的类型重定义 的类型重定义 template class QSharedPointer { typedef T *QSharedPointer:: *RestrictedBool; typedef QtSharedPointer::ExternalRefCountData Data; public: typedef T Type; typedef T element_type; typedef T value_type; typedef value_type *pointer; typedef const value_type *const_pointer; typedef value_type &reference; typedef const value_type &const_reference; typedef qptrdiff difference_type; }; QSharedPointer提供了部分公有和私有的对于模板参数T的类型重定义(说明: 这⾥T类型并不是指⼀个特定类型,⽽是⼀个通⽤/万能类 型。 我们可以把类模板看做成⼀个函数 QSharedPointer为函数名, template中类型列表的为函数形参列表,typedef 为返回值。 T最终 的类型确认待你使⽤时由编译器实例化模板时才能推导出),QSharedPointer类模板分别重定义了模板⼊参T的类型别名、指针、常指针、 引⽤、常引⽤类型。这也是模板的惯⽤⼿法和伎俩⽅便对于类型的获取和使⽤ 原因有以下⼏点: a. 提供公有的对于T的类型重定义⽅便的类外部获取和使⽤T及其衍⽣类型。 b. 类内部实现过程中统⼀,规范对于T的使⽤。 2. QSharedPointer的成员属性 的成员属性 template class QSharedPointer { // @1 Type *value; // @2 Data *d; }; QSharedPointer成员属性⽐较简洁代码段@1声明成员属性value(需要管理的裸指针), 代码段@2声明属性d。Data类型我们从第1点中可 知为QtSharedPointer::ExternalRefCountData 的类型别名。主要作⽤为记录当前持有value的QSharedPointer

21,437

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧