[Development] Don't use Private *d when your class is immutable

Marc Mutz marc.mutz at kdab.com
Fri Mar 3 08:30:09 CET 2017


Hi,

If you have a class that just represents a concrete immutable entity, like 
some system resource's ID, or an SSL elliptic curve algorithm, you can use an 
enum.

Or you can use a class, if you want some richer API than can be had with an 
enum.

In that case, however, *don't* use a Private pointer.

The class is immutable, there's no setters, so why should the private parts be 
implicitly shared? They are naturally globally shared, so just use an int as a 
member and let the compiler deal with the implementaton of the copy and move 
special member functions. The property getters just use the int as an index 
into a global data structure to retrieve the property values.

Good example: QSslEllipticCurve. The int is an index into OpenSSL's internal 
list of elliptic curves, and an int is by what OpenSSL refers to an elliptic 
curve. Any other backend will either have a library that does the same or 
needs to provide some central array/vector with the data. Don't be lazy here. 
The internals are more complicated, but the type is just an int to the 
compiler. The API is more important than the implementation.

Bad example: QSslCipher. Look at all the messy API that just deals with the 
fact it's pimpled. That class is particularly hideous because it allocates 
memory on every copy!

For fun, I de-pimpled a private class. It saved 2+KiB in text size: 
https://codereview.qt-project.org/149499 So to the best of our knowledge, a 
pimpl costs O(KiB) of executable size.

Pimpl is not a virtue, it's a burden. Don't use it unless you must. A 
necessary condition is when there are more than a small, fixed number of 
states in your class. This condition is not sufficient, however, as witnessed 
by QString.

So, please, when reviewing API (now in the final reviews for 5.9 as well as 
when adding new API), don't accept classes that end in Info or Id and contain 
a d-pointer.

Thanks,
Marc

-- 
Marc Mutz <marc.mutz at kdab.com> | Senior Software Engineer
KDAB (Deutschland) GmbH & Co.KG, a KDAB Group Company
Tel: +49-30-521325470
KDAB - The Qt, C++ and OpenGL Experts



More information about the Development mailing list