暗黙的な共有
Qt の多くの C++ クラスは、リソースの使用を最大化し、コピーを最小限に抑えるために、暗黙的なデータ共有を使用しています。暗黙的に共有されるクラスは、引数として渡される際に安全かつ効率的です。これは、データへのポインタのみが渡され、関数がデータに書き込みを行う場合にのみデータがコピーされる、つまり「コピー・オン・ライト」方式が採用されているためです。
概要
共有クラスは、参照カウントとデータを含む共有データブロックへのポインタで構成されています。
共有オブジェクトが作成されると、参照カウントは1に設定されます。新しいオブジェクトが共有データを参照するたびに参照カウントはインクリメントされ、そのオブジェクトが共有データの参照を解除するとデクリメントされます。参照カウントが0になると、共有データは削除されます。
共有オブジェクトを扱う際、オブジェクトをコピーするには2つの方法があります。通常、「ディープコピー」と「シャローコピー」と呼ばれます。ディープコピーとは、オブジェクトそのものを複製することを意味します。 浅いコピーは参照コピーであり、つまり共有データブロックへのポインタのみをコピーするものです。深いコピーを行うことは、メモリとCPUの観点から負荷が高い場合があります。一方、浅いコピーは、ポインタの設定と参照カウントのインクリメントのみを行うため、非常に高速です。
暗黙的に共有されるオブジェクトに対するオブジェクト代入(operator=()) は、浅いコピーを使用して実装されています。
共有の利点は、プログラムがデータを不必要に複製する必要がないため、メモリ使用量が抑えられ、データのコピー回数が減ることです。オブジェクトは簡単に代入でき、関数の引数として渡したり、関数から返したりすることができます。
暗黙的な共有は主に裏側で行われるため、プログラマが気にする必要はほとんどありません。ただし、Qtのコンテナのイテレータは、STLのイテレータとは動作が異なります。「暗黙的な共有によるイテレータの問題」を参照してください。
マルチスレッドアプリケーションでは、「スレッドと暗黙的に共有されるクラス」で説明されているように、暗黙的な共有が行われます。
独自の暗黙的共有クラスを実装する際は、QSharedData およびQSharedDataPointer クラスを使用してください。
暗黙的共有の詳細
暗黙的共有では、オブジェクトが変更されようとしており、かつ参照カウントが1より大きい場合、そのオブジェクトが共有ブロックから自動的に切り離されます。(これは、しばしば「コピー・オン・ライト」または「値セマンティクス」と呼ばれます。)
暗黙的に共有されるクラスは、その内部データを制御します。データを変更するメンバー関数では、データを変更する前に自動的に切り離しが行われます。ただし、コンテナのイテレータに関する特殊なケースには注意が必要です。「暗黙的共有のイテレータの問題」を参照してください。
暗黙的共有を使用するQPen クラスは、内部データを変更するすべてのメンバ関数において、共有データから切り離されます。
コード断片:
void QPen::setCapStyle(Qt::PenCapStyle c)
{
if (d->capStyle == c)
return;
detach();
d->capStyle = c;
}
void QPen::detach()
{
d.detach();
}クラスの一覧
以下に挙げるクラスは、オブジェクトが変更されようとしている場合、共通データから自動的に切り離されます。 プログラマーは、オブジェクトが共有されていることに気づくことさえありません。したがって、これらのクラスの個別のインスタンスは、独立したオブジェクトとして扱うべきです。これらは常に独立したオブジェクトとして振る舞いますが、可能な限りデータを共有するという利点も備えています。このため、コピーのオーバーヘッドを気にすることなく、これらのクラスのインスタンスを関数の引数として値渡しで渡すことができます。
例:
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();この例では、p1 とp2 は、p2 に対してQPainter::begin()が呼び出されるまでデータを共有します。これは、ピクマップへの描画処理によってピクマップが変更されるためです。
警告: 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サービスデータを設定するために使用される | |
Bluetooth LE接続のパラメータの更新を要求または報告する際に使用される | |
GATTサービスデータの作成に使用されます | |
GATTサービスデータの設定に使用されます | |
連想配列を提供するテンプレートクラス | |
MIME タイプ文字列によって表されるファイルまたはデータのタイプを記述します | |
MQTTトピックフィルターを表します | |
MQTTトピック名を表す | |
多値ハッシュテーブル | |
複数の同等のキーを持つ連想配列を提供するテンプレートクラス | |
ネットワークインターフェースでサポートされている 1 つの IP アドレスと、それに関連付けられたネットマスクおよびブロードキャストアドレスを格納します | |
キャッシュ情報 | |
1つのネットワーククッキーを保持します | |
ホストのIPアドレスおよびネットワークインターフェースの一覧 | |
ネットワーク層プロキシ | |
ソケットのプロキシ設定を照会するために使用されます | |
QNetworkAccessManager を使用して送信されるリクエストを保持します | |
共通のネットワークリクエストプロパティを持つリモートサーバーエンドポイントをグループ化するための利便性クラス | |
OpenGL デバッグメッセージをラップする | |
ページ範囲のコレクションを表します | |
各ウィジェットの状態ごとのカラーグループを含みます | |
QPainter が線や図形の輪郭をどのように描画すべきかを定義します | |
データモデル内のデータを特定するために使用される | |
QPainterコマンドを記録および再生するペイントデバイス | |
ペイントデバイスとして使用できるオフスクリーン画像表現 | |
整数精度を使用した点のリスト | |
浮動小数点精度を使用した点のリスト | |
プログラムに渡すことができる環境変数を保持する | |
キューを提供する汎用コンテナ | |
フォントの単一の物理インスタンスへのアクセス | |
正規表現を用いたパターンマッチング | |
ペインターのクリップ領域を指定する | |
正規表現を使用したパターンマッチング | |
QRegularExpression を文字列に対してマッチングさせた結果 | |
QRegularExpression オブジェクトによる文字列のグローバル一致の結果に対するイテレータ | |
ハッシュテーブルベースのセットを提供するテンプレートクラス | |
複数のシェーディング言語に翻訳されたシェーダーの複数のバージョンと、リフレクションメタデータを格納する | |
SQL データベースのテーブルおよびビューのフィールドを操作する | |
SQL文を実行および操作する手段 | |
データベースレコードをカプセル化する | |
X509証明書用の便利なAPI | |
X509 証明書の拡張機能にアクセスするための API | |
SSL暗号化アルゴリズムを表す | |
SSL接続の設定および状態を保持する | |
サーバー向けのディフィー・ヘルマンパラメータ用インターフェース | |
SSLエラー | |
秘密鍵および公開鍵用のインターフェース | |
事前共有鍵(PSK)暗号スイート用の認証データ | |
スタックを提供するテンプレートクラス | |
テキストとそのレイアウトの更新頻度が低い場合に、テキストの描画を最適化します | |
現在マウントされているストレージおよびドライブに関する情報を提供します | |
Unicode 文字列 | |
文字列のリスト | |
QTextDocument内のテキストブロックに関する書式設定情報 | |
文字列内の Unicode テキスト境界を特定する方法 | |
QTextDocument内の文字の書式設定情報 | |
QTextDocument へのアクセスおよび変更を行うための API を提供します | |
QTextDocument からの書式設定済みテキストの一部を表します | |
QTextDocument の書式設定情報 | |
QTextDocument内のフレームの書式設定情報 | |
QTextDocument内の画像の書式設定情報 | |
QTextDocument内のリストに関する書式設定情報 | |
QTextDocument内の表のセルに関する書式設定情報 | |
QTextDocument 内の表の書式設定情報 | |
URL を扱うための便利なインターフェース | |
URLのクエリ文字列内のキー・値ペアを操作する方法 | |
最も一般的な Qt データ型に対するユニオンとして機能する |
© 2026 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.