このページでは

暗黙的な共有

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 など)をコピーする際は注意が必要です 。「暗黙的な共有イテレータの問題」を参照してください。

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

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

QFontVariableAxis

フォント内の可変軸を表します

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

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

QLowEnergyDescriptorData

GATTサービスデータの作成に使用されます

QLowEnergyServiceData

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

QMap

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

QMimeType

MIME タイプ文字列によって表されるファイルまたはデータのタイプを記述します

QMqttTopicFilter

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

QMqttTopicName

MQTTトピック名を表す

QMultiHash

多値ハッシュテーブル

QMultiMap

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

QNetworkAddressEntry

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

QNetworkCacheMetaData

キャッシュ情報

QNetworkCookie

1つのネットワーククッキーを保持します

QNetworkInterface

ホストのIPアドレスおよびネットワークインターフェースの一覧

QNetworkProxy

ネットワーク層プロキシ

QNetworkProxyQuery

ソケットのプロキシ設定を照会するために使用されます

QNetworkRequest

QNetworkAccessManager を使用して送信されるリクエストを保持します

QNetworkRequestFactory

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

QOpenGLDebugMessage

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

QPageRanges

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

QPalette

各ウィジェットの状態ごとのカラーグループを含みます

QPen

QPainter が線や図形の輪郭をどのように描画すべきかを定義します

QPersistentModelIndex

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

QPicture

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

QPixmap

ペイントデバイスとして使用できるオフスクリーン画像表現

QPolygon

整数精度を使用した点のリスト

QPolygonF

浮動小数点精度を使用した点のリスト

QProcessEnvironment

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

QQueue

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

QRawFont

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

QRegExp

正規表現を用いたパターンマッチング

QRegion

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

QRegularExpression

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

QRegularExpressionMatch

QRegularExpression を文字列に対してマッチングさせた結果

QRegularExpressionMatchIterator

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

QSet

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

QShader

複数のシェーディング言語に翻訳されたシェーダーの複数のバージョンと、リフレクションメタデータを格納する

QSqlField

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

QSqlQuery

SQL文を実行および操作する手段

QSqlRecord

データベースレコードをカプセル化する

QSslCertificate

X509証明書用の便利なAPI

QSslCertificateExtension

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

QSslCipher

SSL暗号化アルゴリズムを表す

QSslConfiguration

SSL接続の設定および状態を保持する

QSslDiffieHellmanParameters

サーバー向けのディフィー・ヘルマンパラメータ用インターフェース

QSslError

SSLエラー

QSslKey

秘密鍵および公開鍵用のインターフェース

QSslPreSharedKeyAuthenticator

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

QStack

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

QStaticText

テキストとそのレイアウトの更新頻度が低い場合に、テキストの描画を最適化します

QStorageInfo

現在マウントされているストレージおよびドライブに関する情報を提供します

QString

Unicode 文字列

QStringList

文字列のリスト

QTextBlockFormat

QTextDocument内のテキストブロックに関する書式設定情報

QTextBoundaryFinder

文字列内の Unicode テキスト境界を特定する方法

QTextCharFormat

QTextDocument内の文字の書式設定情報

QTextCursor

QTextDocument へのアクセスおよび変更を行うための API を提供します

QTextDocumentFragment

QTextDocument からの書式設定済みテキストの一部を表します

QTextFormat

QTextDocument の書式設定情報

QTextFrameFormat

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

QTextImageFormat

QTextDocument内の画像の書式設定情報

QTextListFormat

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

QTextTableCellFormat

QTextDocument内の表のセルに関する書式設定情報

QTextTableFormat

QTextDocument 内の表の書式設定情報

QUrl

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

QUrlQuery

URLのクエリ文字列内のキー・値ペアを操作する方法

QVariant

最も一般的な 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.