We bake cookies in your browser for a better experience. Using this site means that you consent. Read More
Many C++ classes in Qt use implicit data sharing to maximize resource usage and minimize copying. Implicitly shared classes are both safe and efficient when passed as arguments, because only a pointer to the data is passed around, and the data is copied only if and when a function writes to it, i.e., copy-on-write.
A shared class consists of a pointer to a shared data block that contains a reference count and the data.
When a shared object is created, it sets the reference count to 1. The reference count is incremented whenever a new object references the shared data, and decremented when the object dereferences the shared data. The shared data is deleted when the reference count becomes zero.
When dealing with shared objects, there are two ways of copying an object. We usually speak about deep and shallow copies. A deep copy implies duplicating an object. A shallow copy is a reference copy, i.e. just a pointer to a shared data block. Making a deep copy can be expensive in terms of memory and CPU. Making a shallow copy is very fast, because it only involves setting a pointer and incrementing the reference count.
Object assignment (with operator=()) for implicitly shared objects is implemented using shallow copies.
The benefit of sharing is that a program does not need to duplicate data unnecessarily, which results in lower memory use and less copying of data. Objects can easily be assigned, sent as function arguments, and returned from functions.
Implicit sharing takes place behind the scenes; the programmer does not need to worry about it. Even in multithreaded applications, implicit sharing takes place, as explained in Threads and Implicitly Shared Classes.
When implementing your own implicitly shared classes, use the QSharedData and QSharedDataPointer classes.
Implicit sharing automatically detaches the object from a shared block if the object is about to change and the reference count is greater than one. (This is often called copy-on-write or value semantics.)
An implicitly shared class has total control of its internal data. In any member functions that modify its data, it automatically detaches before modifying the data.
The QPen class, which uses implicit sharing, detaches from the shared data in all member functions that change the internal data.
Code fragment:
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 } }
The classes listed below automatically detach from common data if an object is about to be changed. The programmer will not even notice that the objects are shared. Thus you should treat separate instances of them as separate objects. They will always behave as separate objects but with the added benefit of sharing data whenever possible. For this reason, you can pass instances of these classes as arguments to functions by value without concern for the copying overhead.
Example:
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();
In this example, p1 and p2 share data until QPainter::begin() is called for p2, because painting a pixmap will modify it.
Warning: Do not copy an implicitly shared container (QMap, QVector, etc.) while you are iterating over it using an non-const STL-style iterator.
QGLColormap class is used for installing custom colormaps into a QGLWidget
Array of bits
Monochrome (1-bit depth) pixmaps
Defines the fill pattern of shapes drawn by QPainter
Array of bytes
Template class that provides a cache
Template class that provides a contiguous cache
Mouse cursor with an arbitrary shape
Access to directory structures and their contents
System-independent file information
Specifies a font used for drawing text
General information about fonts
Font metrics information
Font metrics information
Used in combination with QBrush to specify gradient fills
Template class that provides a hash-table-based dictionary
Scalable icons in different modes and states
Hardware-independent image representation that allows direct access to the pixel data, and can be used as a paint device
Encapsulates a key sequence as used by shortcuts
Template class that provides linked lists
Template class that provides lists
Converts between numbers and their string representations in various languages
Template class that provides a skip-list-based dictionary
Convenience QHash subclass that provides multi-valued hashes
Convenience QMap subclass that provides multi-valued maps
Container for painting operations, enabling graphical shapes to be constructed and reused
Contains color groups for each widget state
Defines how a QPainter should draw lines and outlines of shapes
Paint device that records and replays QPainter commands
Off-screen image representation that can be used as a paint device
Vector of points using integer precision
Vector of points using floating point precision
Generic container that provides a queue
Pattern matching using regular expressions
Specifies a clip region for a painter
Template class that provides a hash-table-based set
Manipulates the fields in SQL database tables and views
Means of executing and manipulating SQL statements
Encapsulates a database record
Template class that provides a stack
Unicode character string
List of strings
Way of finding Unicode text boundaries in a string
Offers an API to access and modify QTextDocuments
Represents a piece of formatted text from a QTextDocument
Formatting information for a QTextDocument
Convenient interface for working with URLs
Acts like a union for the most common Qt data types
Template class that provides a dynamic array
Information about the X display configuration
© 2016 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.