暗黙の共有

Qt の多くの C++ クラスは、暗黙的なデータ共有を使用して、リソースの使用量を最大化し、コピーを最小化します。暗黙的に共有されるクラスは、引数として渡されるときに安全で効率的です。なぜなら、データへのポインタだけが渡され、データは関数が書き込むときだけコピーされるからです。

概要

共有クラスは、参照カウントとデータを含む共有データ・ブロックへのポインタから構成されます。

参照カウントは、新しいオブジェクトが共有データを参照するたびにインクリメントされ、オブジェクトが共有データを非参照にするとデクリメントされる。参照カウントがゼロになると、共有データは削除される。

共有オブジェクトを扱う場合、オブジェクトのコピーには2つの方法がある。通常、ディープコピーと シャローコピーと呼ばれる。ディープコピーはオブジェクトの複製を意味する。シャロー・コピーは参照コピー、つまり共有データ・ブロックへの単なるポインターだ。ディープコピーの作成は、メモリとCPUの点で高価になる可能性がある。シャローコピーは、ポインターをセットして参照カウントをインクリメントするだけなので、非常に高速だ。

暗黙的に共有されたオブジェクトのオブジェクト割り当て(operator=()を使用)は、シャローコピーを使用して実装されています。

共有の利点は、プログラムが不必要にデータを複製する必要がないことであり、その結果、メモリの使用量が減り、データのコピー回数が減る。オブジェクトは簡単に代入したり、関数の引数として送ったり、関数から返したりすることができます。

暗黙の共有はほとんどの場合、舞台裏で行われるため、プログラマが気にする必要はほとんどありません。しかし、Qtのコンテナ・イテレータは、STLのものとは動作が異なります。暗黙的共有イテレータの問題」を参照してください。

マルチスレッド・アプリケーションでは、スレッドと暗黙の共有クラスで説明したように、暗黙の共有が行われます。

独自の暗黙的共有クラスを実装する場合は、QSharedDataQSharedDataPointer クラスを使用してください。

暗黙的共有の詳細

暗黙的共有は、オブジェクトが変更されようとしていて、参照カウントが1より大きい場合、共有ブロックからオブジェクトを自動的に切り離します。(これはコピーオンライトまたは値セマンティクスと呼ばれることが多い)。

暗黙的に共有されるクラスは、その内部データを制御することができます。そのデータを変更するメンバ関数では、データを変更する前に自動的にデタッチします。ただし、コンテナ・イテレータの場合は特殊であることに注意してください。

QPen 、暗黙の共有を使っているクラスは、内部データを変更するすべてのメンバ関数において、共有データからデタッチします。

コードの断片:

void QPen::setStyle(Qt::PenStyle style)
{
    detach();           // detach from common data
    d->style = style;   // set the style member
}

void QPen::detach()
{
    if (d->ref != 1) {
        ...             // perform a deep copy
    }
}

クラスのリスト

以下に挙げるクラスは、オブジェクトが変更されそうになると自動的に共通データから切り離される。プログラマーはオブジェクトが共有されていることに気づきません。したがって、これらのインスタンスを別々のオブジェクトとして扱う必要があります。これらは常に別々のオブジェクトとして振る舞いますが、可能な限りデータを共有するという利点もあります。このため、コピーのオーバーヘッドを気にすることなく、これらのクラスのインスタンスを関数の引数として値で渡すことができます。

QPixmap p1, p2;
p1.load("image.bmp");
p2 = p1;                        // p1 and p2 share data

QPainter paint;
paint.begin(&p2);               // cuts p2 loose from p1
paint.drawText(0,50, "Hi");
paint.end();

この例では、p2 に対してQPainter::begin() が呼び出されるまで、p1p2 がデータを共有しています。

警告: STLスタイルのイテレータを使用している間、暗黙の共有コンテナ(QMapQList など)のコピーには注意してください。暗黙の共有イテレータ問題を参照。

QBitArray

ビットの配列

QBitmap

モノクロ(深さ1ビット)ピクセルマップ

QBrush

QPainterで描画される図形の塗りつぶしパターンを定義します。

QByteArray

バイト配列

QByteArrayList

バイト配列のリスト

QByteArrayView

QByteArray API の読み取り専用サブセットを使用したバイト配列の表示

QCache

キャッシュを提供するテンプレートクラス

QCollator

ローカライズされた照合アルゴリズムに従って文字列を比較します。

QCollatorSortKey

文字列の照合を高速化するために使用できます。

QCommandLineOption

可能なコマンドラインオプションの定義

QContiguousCache

連続キャッシュを提供するテンプレート・クラス

QCursor

任意の形状のマウスカーソル

QDBusPendingCall

保留中の非同期呼び出し1つを参照する

QDBusUnixFileDescriptor

1つのUnixファイル記述子を保持

QDateTime

日付と時刻の関数

QDebug

デバッグ情報の出力ストリーム

QDir

ディレクトリ構造とその内容へのアクセス

QDnsDomainNameRecord

ドメイン名レコードに関する情報の格納

QDnsHostAddressRecord

ホスト・アドレス・レコードに関する情報を格納する

QDnsMailExchangeRecord

DNS MXレコードに関する情報を格納

QDnsServiceRecord

DNS SRVレコードに関する情報を格納します。

QDnsTextRecord

DNS TXTレコードに関する情報を保存します。

QDnsTlsAssociationRecord

DNS TLSAレコードに関する情報を保存します。

QFileInfo

ファイルシステムエントリに関する情報を取得するためのOS非依存API

QFont

テキストの描画に使用するフォントのクエリを指定する

QFontInfo

フォントに関する一般情報

QFontMetrics

フォントメトリクス情報

QFontMetricsF

フォント・メトリクス情報

QFormDataBuilder

QHttpMultiPart オブジェクトの構築を簡略化する便利なクラス

QFormDataPartBuilder

QHttpPart オブジェクトの作成を簡略化するための便利なクラスです。

QGeoAreaMonitorInfo

近接を監視する領域または領域のパラメータを記述します。

QGeoPositionInfo

特定の時点での全地球的な位置、方向、速度について収集された情報を含みます。

QGeoSatelliteInfo

衛星に関する基本情報を含む

QGlyphRun

フォントの内部グリフへの直接アクセス

QGradient

QBrush と組み合わせて使用し、グラデーション塗りつぶしを指定します。

QHash

ハッシュテーブルベースの辞書を提供するテンプレートクラス

QHostAddress

IPアドレス

QHttp1Configuration

HTTP/1のパラメータと設定を制御する

QHttp2Configuration

HTTP/2 パラメータと設定を制御する

QHttpPart

HTTPマルチパートMIMEメッセージ内で使用されるボディ部分を保持します。

QIcon

さまざまなモードと状態でのスケーラブルなアイコン

QImage

ピクセルデータに直接アクセスでき、ペイントデバイスとして使用できる、ハードウェアに依存しない画像表現

QJsonArray

JSON配列をカプセル化

QJsonDocument

JSONドキュメントを読み書きする方法

QJsonObject

JSONオブジェクトのカプセル化

QJsonParseError

JSONの解析中にエラーを報告するために使用されます。

QJsonValue

JSON内の値をカプセル化する

QKeySequence

ショートカットで使用されるキーシーケンスをカプセル化する

QLinkedList

リンクリストを提供するテンプレート・クラス

QList

動的配列を提供するテンプレート・クラス

QLocale

様々な言語における数値とその文字列表現を変換する

QLowEnergyAdvertisingData

Bluetooth Low Energyの広告中にブロードキャストされるデータを表します。

QLowEnergyAdvertisingParameters

Bluetooth Low Energy広告に使用されるパラメータを表します。

QLowEnergyCharacteristicData

GATTサービスデータの設定に使用されます

QLowEnergyConnectionParameters

ブルートゥースLE接続のパラメータの更新を要求または報告する際に使用される

QLowEnergyDescriptorData

GATT サービスデータの作成に使用

QLowEnergyServiceData

GATT サービスデータの設定に使用

QMap

連想配列を提供するテンプレートクラス

QMimeType

MIME タイプ文字列で表現されるファイルやデータのタイプを記述します。

QMqttTopicFilter

MQTTトピックフィルターを表す

QMqttTopicName

MQTTトピック名を表す

QMultiHash

多値ハッシュを提供する便利な QHash サブクラス

QMultiMap

複数の等価キーを持つ連想配列を提供するテンプレート・クラス

QNetworkAddressEntry

ネットワーク・インターフェースでサポートされる 1 つの IP アドレスを、関連するネットマスクおよびブロードキャスト・アドレスとともに格納します。

QNetworkCacheMetaData

キャッシュ情報

QNetworkCookie

1つのネットワーク・クッキーを保持

QNetworkInterface

ホストのIPアドレスとネットワーク・インタフェースのリスト

QNetworkProxy

ネットワーク層プロキシ

QNetworkProxyQuery

ソケットのプロキシ設定を問い合わせるために使用される

QNetworkRequest

QNetworkAccessManager で送信するリクエストを保持します。

QNetworkRequestFactory

共通のネットワークリクエストプロパティを共有するリモートサーバーエンドポイントをグループ化するための便利なクラス

QOpenGLDebugMessage

OpenGLデバッグメッセージをラップする

QPageRanges

ページ範囲のコレクションを表します。

QPainterPath

グラフィカルな形状を構築して再利用できるようにする、ペイント操作用のコンテナ

QPalette

各ウィジェットの状態のためのカラーグループを含む

QPen

QPainterが図形の線や輪郭をどのように描くかを定義する

QPersistentModelIndex

データモデル内のデータの位置を特定するために使用される

QPicture

QPainterコマンドを記録・再生するペイント・デバイス

QPixmap

ペイント・デバイスとして使用できる画面外の画像表現

QPolygon

整数精度の点のリスト

QPolygonF

浮動小数点精度の点のリスト

QProcessEnvironment

プログラムに渡すことができる環境変数を保持する。

QQueue

キューを提供する汎用コンテナ

QRawFont

フォントの単一の物理インスタンスへのアクセス

QRegExp

正規表現を使ったパターンマッチ

QRegion

ペインターのクリップ領域を指定する

QRegularExpression

正規表現を使用したパターンマッチ

QRegularExpressionMatch

文字列に対する QRegularExpression のマッチング結果

QRegularExpressionMatchIterator

QRegularExpression オブジェクトの文字列に対するグローバルマッチの結果のイテレーター

QSet

ハッシュ・テーブル・ベースのセットを提供するテンプレート・クラス

QSqlField

SQL データベースのテーブルやビューのフィールドを操作する

QSqlQuery

SQL 文を実行し操作する手段

QSqlRecord

データベース・レコードのカプセル化

QSslCertificate

X509証明書の便利なAPI

QSslCertificateExtension

X509 証明書の拡張にアクセスするための API

QSslCipher

SSL暗号を表す

QSslConfiguration

SSL 接続の設定と状態を保持する

QSslDiffieHellmanParameters

サーバーの Diffie-Hellman パラメーター用インターフェース

QSslError

SSL エラー

QSslKey

秘密鍵と公開鍵のインターフェース

QSslPreSharedKeyAuthenticator

事前共有鍵(PSK)暗号スイート用の認証データ

QStack

スタックを提供するテンプレートクラス

QStaticText

テキストとそのレイアウトがまれに更新される場合に、テキストの最適化された描画を可能にする

QStorageInfo

現在マウントされているストレージとドライブに関する情報の提供

QString

ユニコード文字列

QStringList

文字列のリスト

QTextBlockFormat

QTextDocument 内のテキストブロックのフォーマット情報

QTextBoundaryFinder

文字列内の Unicode テキスト境界を見つける方法

QTextCharFormat

QTextDocument 内の文字のフォーマット情報

QTextCursor

QTextDocuments にアクセスし、変更するための API を提供します。

QTextDocumentFragment

QTextDocument のフォーマットされたテキストを表す

QTextFormat

QTextDocument のフォーマット情報

QTextFrameFormat

QTextDocument 内のフレームの書式情報

QTextImageFormat

QTextDocument 内の画像に関する書式情報

QTextListFormat

QTextDocument 内のリストに関する書式情報

QTextTableCellFormat

QTextDocument における表セルの書式情報

QTextTableFormat

QTextDocument における表の書式情報

QUrl

URL を扱うための便利なインターフェイス

QUrlQuery

URLのクエリのキーと値のペアを操作する方法

QVariant

最も一般的な Qt データ型のユニオンのように動作する

©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。