암묵적 공유
Qt의 많은 C++ 클래스는 암시적 데이터 공유를 사용하여 리소스 사용을 극대화하고 복사를 최소화합니다. 암시적으로 공유되는 클래스는 데이터에 대한 포인터만 전달되고 함수가 데이터를 쓸 때만 데이터가 복사되기 때문에(즉, 쓰기 시 복사) 인자로 전달될 때 안전하고 효율적입니다.
개요
공유 클래스는 참조 횟수와 데이터를 포함하는 공유 데이터 블록에 대한 포인터로 구성됩니다.
공유 객체가 생성되면 참조 카운트가 1로 설정됩니다. 새 객체가 공유 데이터를 참조할 때마다 참조 카운트가 증가하고, 객체가 공유 데이터를 참조 해제하면 참조 카운트가 감소합니다. 참조 카운트가 0이 되면 공유 데이터는 삭제됩니다.
공유 객체를 다룰 때 객체를 복사하는 방법에는 두 가지가 있습니다. 일반적으로 딥 카피와 숏 카피에 대해 이야기합니다. 딥 카피는 객체를 복제하는 것을 의미합니다. 얕은 복사본은 참조 복사본, 즉 공유 데이터 블록에 대한 포인터일 뿐입니다. 딥 카피는 메모리와 CPU 측면에서 비용이 많이 들 수 있습니다. 얕은 복사본은 포인터를 설정하고 참조 횟수를 늘리기만 하면 되기 때문에 매우 빠릅니다.
암시적으로 공유되는 객체에 대한 객체 할당(연산자=() 사용)은 얕은 복사본을 사용하여 구현됩니다.
공유의 장점은 프로그램이 불필요하게 데이터를 복제할 필요가 없으므로 메모리 사용량과 데이터 복사가 줄어든다는 것입니다. 객체를 쉽게 할당하고, 함수 인수로 전송하고, 함수에서 반환할 수 있습니다.
암시적 공유는 대부분 백그라운드에서 이루어지므로 프로그래머는 이에 대해 걱정할 필요가 거의 없습니다. 그러나 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();
이 예제에서 p1
와 p2
은 QPainter::begin()가 p2
에 대해 호출될 때까지 데이터를 공유하는데, 이는 픽셀맵을 그리면 수정되기 때문입니다.
경고: STL 스타일 반복기를 사용하는 동안 암시적으로 공유되는 컨테이너(QMap, QList, 등)를 복사할 때는 주의하세요. 암시적 공유 반복기 문제를 참조하세요.
비트 배열 | |
흑백(1비트 깊이) 픽셀맵 | |
QPainter에서 그리는 도형의 채우기 패턴을 정의합니다. | |
바이트 배열 | |
바이트 배열 목록 | |
QByteArray API의 읽기 전용 하위 집합으로 바이트 배열을 봅니다. | |
캐시를 제공하는 템플릿 클래스 | |
지역화된 콜레이션 알고리즘에 따라 문자열을 비교합니다. | |
문자열 데이터 정렬 속도를 높이는 데 사용 가능 | |
가능한 명령줄 옵션을 정의합니다. | |
연속 캐시를 제공하는 템플릿 클래스 | |
임의의 모양을 가진 마우스 커서 | |
하나의 보류 중인 비동기 호출을 참조합니다. | |
하나의 유닉스 파일 기술자 보유 | |
날짜 및 시간 함수 | |
디버깅 정보를 위한 출력 스트림 | |
디렉토리 구조 및 그 내용에 대한 액세스 | |
도메인 네임 레코드에 대한 정보를 저장합니다. | |
호스트 주소 레코드에 대한 정보를 저장합니다. | |
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의 값을 캡슐화합니다. | |
단축키에 사용되는 키 시퀀스를 캡슐화합니다. | |
링크된 목록을 제공하는 템플릿 클래스 | |
동적 배열을 제공하는 템플릿 클래스 | |
다양한 언어로 숫자와 그 문자열 표현을 변환합니다. | |
블루투스 저에너지 광고 중에 브로드캐스트할 데이터를 나타냅니다. | |
블루투스 저에너지 광고에 사용되는 파라미터를 나타냅니다. | |
GATT 서비스 데이터를 설정하는 데 사용 | |
Bluetooth LE 연결의 매개변수 업데이트를 요청하거나 보고할 때 사용됩니다. | |
GATT 서비스 데이터 생성에 사용 | |
GATT 서비스 데이터를 설정하는 데 사용됩니다. | |
연관 배열을 제공하는 템플릿 클래스 | |
파일 또는 데이터의 유형을 설명하며, MIME 유형 문자열로 표현됩니다. | |
MQTT 토픽 필터를 나타냅니다. | |
MQTT 토픽 이름을 나타냅니다. | |
다중 값 해시를 제공하는 편리한 QHash 서브 클래스 | |
여러 개의 동등한 키가 있는 연관 배열을 제공하는 템플릿 클래스 | |
네트워크 인터페이스에서 지원하는 하나의 IP 주소와 관련 넷마스크 및 브로드캐스트 주소를 저장합니다. | |
캐시 정보 | |
네트워크 쿠키 1개 보유 | |
호스트의 IP 주소 및 네트워크 인터페이스 목록 | |
네트워크 계층 프록시 | |
소켓의 프록시 설정을 쿼리하는 데 사용됩니다. | |
QNetworkAccessManager로 전송할 요청을 보유합니다. | |
공통 네트워크 요청 속성을 공유하는 원격 서버 엔드포인트를 그룹화하기 위한 편의 클래스 | |
OpenGL 디버그 메시지를 래핑합니다. | |
페이지 범위의 컬렉션을 나타냅니다. | |
그래픽 모양을 구성하고 재사용할 수 있는 페인팅 작업용 컨테이너 | |
각 위젯 상태에 대한 색상 그룹을 포함합니다. | |
QPainter가 도형의 선과 윤곽선을 그리는 방법을 정의합니다. | |
데이터 모델에서 데이터를 찾는 데 사용 | |
QPainter 명령을 기록하고 재생하는 페인트 장치 | |
페인트 장치로 사용할 수 있는 화면 밖 이미지 표현 | |
정수 정밀도를 사용하는 포인트 목록 | |
부동 소수점 정밀도를 사용하는 포인트 목록 | |
프로그램에 전달할 수 있는 환경 변수를 보유합니다. | |
큐를 제공하는 일반 컨테이너 | |
글꼴의 단일 물리적 인스턴스에 대한 액세스 | |
정규 표현식을 사용한 패턴 일치 | |
페인터의 클립 영역 지정 | |
정규 표현식을 사용한 패턴 일치 | |
문자열에 대한 QRegularExpression 일치 결과 | |
문자열에 대한 QRegularExpression 객체의 전역 일치 결과에 대한 이터레이터 | |
해시 테이블 기반 집합을 제공하는 템플릿 클래스 | |
SQL 데이터베이스 테이블 및 뷰의 필드를 조작합니다. | |
SQL 문을 실행하고 조작하는 수단 | |
데이터베이스 레코드 캡슐화 | |
X509 인증서를 위한 편리한 API | |
X509 인증서의 확장에 액세스하기 위한 API | |
SSL 암호화 암호를 나타냅니다. | |
SSL 연결의 구성 및 상태 보유 | |
서버용 Diffie-Hellman 매개변수용 인터페이스 | |
SSL 오류 | |
비공개 및 공개 키용 인터페이스 | |
PSK(사전 공유 키) 암호 집합에 대한 인증 데이터 | |
스택을 제공하는 템플릿 클래스 | |
텍스트 및 레이아웃이 드물게 업데이트될 때 최적화된 텍스트 그리기 가능 | |
현재 마운트된 스토리지 및 드라이브에 대한 정보 제공 | |
유니코드 문자 문자열 | |
문자열 목록 | |
QTextDocument의 텍스트 블록에 대한 서식 정보 | |
문자열에서 유니코드 텍스트 경계를 찾는 방법 | |
QTextDocument의 문자에 대한 서식 정보 | |
QTextDocument에 액세스하고 수정하는 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.