zoukankan      html  css  js  c++  java
  • Qt框架浅析之一 ------- 隐式共享(Implicit Sharing)

    https://blog.csdn.net/Moke_8453/article/details/54172310

    嗯,也许很多人都讲过这个Qt架构这个话题,但是我还是要讲一下这个,希望能有一点新意吧。

        我们先来看看Qt官方关于Qt隐式共享的解释:

        Many C++ classes in Qt use implicit data sharing to maximize resource usage and minimize copying. Implicitly shared classes are both safe and efficient when passed as arguments, because only a pointer to the data is passed around, and the data is copied only if and when a function writes to it, i.e., copy-on-write.

        翻译:很多Qt中的C++类运用了隐式数据共享机制去最大化资源有效利用和最小化复制克隆操作。隐式共享类当作为函数参数传递的时候,不仅安全而且效率很高,因为传递的时候只是传递的数据的指针,数据本身只当自己被修改的时候才会去复制。简称写时复制。

        文章最后附上所有隐式共享类名单,讲一下这个东西的工作机理。比如我们往往会在信号槽中做这样的事情:

    connect(yourLineEdit,SIGNAL(textEdited(QString)),this,SLOT(sltDoTextEdited(QString)));

    这个时候,QString这个类作为信号槽函数的参数传递,传递的时候只会传递对应QString对象所在的地址指针,而不会去调用QString的拷贝复制函数。在C++中,为了让参数传递的时候不去调用参数的拷贝复制函数一般是加const T &,你们如果去寻找对应的信号声明也可以发现,很多信号声明的时候会加上const T &,避免拷贝函数构造和参数修改。

        这里说C++的Const T&只是为了帮助大家理解这个隐式共享的概念,并不是说Qt就是用const T &实现的隐式共享,请谨记。

        Qt5和隐式共享机制实现相关的类:QSaredData和QSharedPointer。

        qt的隐式共享类list:
    QBitArray
    QBitmap
    QBrush
    QByteArray
    QByteArrayList
    QCache
    QCollator
    QCollatorSortKey
    QCommandLineOption
    QContiguousCache
    QCursor
    QDBusPendingCall
    QDBusUnixFileDescriptor
    QDateTime
    QDebug
    QDir
    QDnsDomainNameRecord
    QDnsHostAddressRecord
    QDnsMailExchangeRecord
    QDnsServiceRecordQDnsTextRecord
    QFileInfo
    QFont
    QFontInfo
    QFontMetrics
    QFontMetricsF
    QGlyphRun
    QGradient
    QHash
    QHttpPart
    QIcon
    QImage
    QKeySequence
    QLinkedList
    QList
    QLocale
    QMap
    QMimeType
    QMultiHash
    QMultiMap
    QNetworkAddressEntry
    QNetworkCacheMetaData
    QNetworkConfiguration
    QNetworkCookie
    QNetworkInterface
    QNetworkProxy
    QNetworkProxyQuery
    QNetworkRequest
    QOpenGLDebugMessage
    QPainterPath
    QPalette
    QPen
    QPersistentModelIndex
    QPicture
    QPixmap
    QPolygon
    QPolygonF
    QProcessEnvironment
    QQueue
    QRawFont
    QRegExp
    QRegion
    QRegularExpression
    QRegularExpressionMatch
    QRegularExpressionMatchIterator
    QSet
    QSslCertificate
    QSslCertificateExtension
    QSslCipher
    QSslConfiguration
    QSslError
    QSslKey
    QStack
    QStaticText
    QStorageInfo
    QString
    QStringList
    QTextBlockFormat
    QTextBoundaryFinder
    QTextCharFormat
    QTextCursor
    QTextDocumentFragment
    QTextFormat
    QTextFrameFormat
    QTextImageFormat
    QTextListFormat
    QTextTableCellFormat
    QTextTableFormat
    QUrl
    QUrlQuery
    QVariant
    QVector

  • 相关阅读:
    java一个字符串中出现次数最多的字符以及次数
    按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345678“,”90000000”
    Java 替换空格
    Java中equals()和“==”区别
    ramfs和tmpfs的区别
    C语言中的nan和inf使用
    Abp中SwaggerUI的多个接口文档配置说明
    Abp中SwaggerUI的接口说明文档配置
    Abp中SwaggerUI的接口文档添加上传文件参数类型
    Abp中自定义Exception的HttpStatusCode
  • 原文地址:https://www.cnblogs.com/Vancamel/p/11346282.html
Copyright © 2011-2022 走看看