暗黙の共有
Qt の多くの C++ クラスは、リソースの使用量を最大化し、コピーを最小化するために、暗黙的なデータ共有を使用しています。暗黙的に共有されるクラスは、引数として渡される際に安全かつ効率的です。なぜなら、データへのポインタだけが渡され、データがコピーされるのは関数が書き込むときだけだからです。
概要
共有クラスは、参照カウントとデータを含む共有データ・ブロックへのポインタから構成されます。
参照カウントは、新しいオブジェクトが共有データを参照するたびにインクリメントされ、オブジェクトが共有データを非参照にするとデクリメントされる。参照カウントがゼロになると、共有データは削除される。
共有オブジェクトを扱う場合、オブジェクトのコピーには2つの方法がある。通常、ディープコピーと シャローコピーと呼ばれる。ディープコピーはオブジェクトの複製を意味する。シャロー・コピーは参照コピー、つまり共有データ・ブロックへの単なるポインターだ。ディープコピーの作成は、メモリとCPUの点で高価になる可能性がある。シャローコピーは、ポインターをセットして参照カウントをインクリメントするだけなので、非常に高速だ。
暗黙的に共有されたオブジェクトのオブジェクト割り当て(operator=()を使用)は、シャローコピーを使用して実装されています。
共有の利点は、プログラムが不必要にデータを複製する必要がないことであり、その結果、メモリ使用量が減り、データのコピー回数が減る。オブジェクトは簡単に代入したり、関数の引数として送ったり、関数から返したりすることができます。
暗黙の共有はほとんどの場合、舞台裏で行われるため、プログラマが気にする必要はほとんどありません。しかし、Qtのコンテナ・イテレータはSTLのそれとは動作が異なります。暗黙的共有イテレータの問題」を参照してください。
マルチスレッド・アプリケーションでは、スレッドと暗黙の共有クラスで説明したように、暗黙の共有が行われます。
独自の暗黙的共有クラスを実装する場合は、QSharedData とQSharedDataPointer クラスを使用してください。
暗黙的共有の詳細
暗黙的共有は、オブジェクトが変更されようとしていて、参照カウントが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() が呼び出されるまで、p1
とp2
がデータを共有しています。
警告: STLスタイルのイテレータを使用している間、暗黙の共有コンテナ(QMap 、QList など)のコピーには注意してください。暗黙の共有イテレータ問題を参照。
ビットの配列 | |
モノクロ(深さ1ビット)ピクセルマップ | |
QPainterで描画される図形の塗りつぶしパターンを定義します。 | |
バイト配列 | |
バイト配列のリスト | |
QByteArray API の読み取り専用サブセットを使用したバイト配列の表示 | |
キャッシュを提供するテンプレートクラス | |
ローカライズされた照合アルゴリズムに従って文字列を比較します。 | |
文字列の照合を高速化するために使用できます。 | |
可能なコマンドラインオプションの定義 | |
連続キャッシュを提供するテンプレート・クラス | |
任意の形状のマウスカーソル | |
保留中の非同期呼び出し1つを参照する | |
1つのUnixファイル記述子を保持 | |
日付と時刻の関数 | |
デバッグ情報の出力ストリーム | |
ディレクトリ構造とその内容へのアクセス | |
ドメイン名レコードに関する情報の格納 | |
ホスト・アドレス・レコードに関する情報を格納する | |
DNS MXレコードに関する情報を格納 | |
DNS SRVレコードに関する情報を格納します。 | |
DNS TXTレコードに関する情報を保存します。 | |
DNS TLSAレコードに関する情報を保存します。 | |
ファイルシステムエントリに関する情報を取得するためのOS非依存API | |
テキストの描画に使用するフォントのクエリを指定する | |
フォントに関する一般情報 | |
フォントメトリクス情報 | |
フォント・メトリクス情報 | |
フォントの可変軸を表します | |
QHttpMultiPart オブジェクトの構築を簡略化するための便利なクラスです。 | |
QHttpPart オブジェクトの構築を簡素化するための便利なクラスです。 | |
近接を監視する領域または領域のパラメータを記述します。 | |
特定の時点での全地球的な位置、方向、速度について収集された情報を含みます。 | |
衛星に関する基本情報を含む | |
フォントの内部グリフへの直接アクセス | |
QBrush と組み合わせて使用し、グラデーション塗りつぶしを指定します。 | |
ハッシュテーブルベースの辞書を提供するテンプレートクラス | |
IPアドレス | |
HTTP/1のパラメータと設定を制御する | |
HTTP/2 パラメータと設定を制御する | |
HTTPマルチパートMIMEメッセージ内で使用されるボディ部分を保持します。 | |
さまざまなモードと状態でのスケーラブルなアイコン | |
ピクセルデータに直接アクセスでき、ペイントデバイスとして使用できる、ハードウェアに依存しない画像表現 | |
JSON配列をカプセル化 | |
JSONドキュメントを読み書きする方法 | |
JSONオブジェクトのカプセル化 | |
JSONの解析中にエラーを報告するために使用されます。 | |
JSON内の値をカプセル化する | |
ショートカットで使用されるキーシーケンスをカプセル化する | |
リンクリストを提供するテンプレート・クラス | |
動的配列を提供するテンプレート・クラス | |
様々な言語における数値とその文字列表現を変換する | |
Bluetooth Low Energyの広告中にブロードキャストされるデータを表す | |
Bluetooth Low Energy広告に使用されるパラメータを表します。 | |
GATTサービスデータの設定に使用されます | |
ブルートゥースLE接続のパラメータの更新を要求または報告する際に使用される | |
GATT サービスデータの作成に使用 | |
GATT サービスデータの設定に使用 | |
連想配列を提供するテンプレートクラス | |
MIME タイプ文字列で表現されるファイルやデータのタイプを記述します。 | |
MQTTトピックフィルターを表す | |
MQTTトピック名を表す | |
多値ハッシュテーブル | |
複数の等価なキーを持つ連想配列を提供するテンプレート・クラス | |
ネットワーク・インターフェイスがサポートする 1 つの IP アドレスを、関連するネットマスクおよびブロードキャスト・アドレスとともに格納します。 | |
キャッシュ情報 | |
1つのネットワーク・クッキーを保持 | |
ホストのIPアドレスとネットワーク・インタフェースのリスト | |
ネットワーク層プロキシ | |
ソケットのプロキシ設定を問い合わせるために使用される | |
QNetworkAccessManager で送信するリクエストを保持します。 | |
共通のネットワークリクエストプロパティを共有するリモートサーバーエンドポイントをグループ化するための便利なクラス | |
OpenGLデバッグメッセージをラップする | |
ページ範囲のコレクションを表します。 | |
グラフィカルな形状を構築して再利用できるようにする、ペイント操作用のコンテナ | |
各ウィジェットの状態のためのカラーグループを含む | |
QPainterが図形の線や輪郭をどのように描くかを定義する | |
データモデル内のデータの位置を特定するために使用される | |
QPainterコマンドを記録・再生するペイント・デバイス | |
ペイント・デバイスとして使用できる画面外の画像表現 | |
整数精度の点のリスト | |
浮動小数点精度の点のリスト | |
プログラムに渡すことができる環境変数を保持する。 | |
キューを提供する汎用コンテナ | |
フォントの単一の物理インスタンスへのアクセス | |
正規表現を使ったパターンマッチ | |
ペインターのクリップ領域を指定する | |
正規表現を使用したパターンマッチング | |
文字列に対する QRegularExpression のマッチング結果 | |
QRegularExpression オブジェクトの文字列に対するグローバルマッチの結果のイテレーター | |
ハッシュ・テーブル・ベースのセットを提供するテンプレート・クラス | |
SQL データベースのテーブルやビューのフィールドを操作する | |
SQL 文を実行し操作する手段 | |
データベース・レコードのカプセル化 | |
X509証明書の便利なAPI | |
X509 証明書の拡張にアクセスするための API | |
SSL暗号を表す | |
SSL 接続の設定と状態を保持する | |
サーバーの Diffie-Hellman パラメーター用インターフェース | |
SSL エラー | |
秘密鍵と公開鍵のインターフェース | |
事前共有鍵(PSK)暗号スイート用の認証データ | |
スタックを提供するテンプレートクラス | |
テキストとそのレイアウトがまれに更新される場合に、テキストの最適化された描画を可能にする | |
現在マウントされているストレージとドライブに関する情報の提供 | |
ユニコード文字列 | |
文字列のリスト | |
QTextDocument 内のテキストブロックのフォーマット情報 | |
文字列内の Unicode テキスト境界を見つける方法 | |
QTextDocument 内の文字のフォーマット情報 | |
QTextDocuments にアクセスし、変更するための API を提供します。 | |
QTextDocument のフォーマットされたテキストを表す | |
QTextDocument のフォーマット情報 | |
QTextDocument 内のフレームの書式情報 | |
QTextDocument 内の画像に関する書式情報 | |
QTextDocument 内のリストに関する書式情報 | |
QTextDocument における表セルの書式情報 | |
QTextDocument における表の書式情報 | |
URL を扱うための便利なインターフェイス | |
URLのクエリのキーと値のペアを操作する方法 | |
最も一般的な Qt データ型のユニオンのように動作する |
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.