[Development] QProperty and library coding guide
Thiago Macieira
thiago.macieira at intel.com
Fri Jul 17 17:30:52 CEST 2020
On Friday, 17 July 2020 00:25:04 PDT Lars Knoll wrote:
> Yes, it can and it does work. And it’s what we should be doing on compilers
> that support [[no_unique_address]].
The problem is that you can't change your mind, since it affects binary
compatibility. See https://godbolt.org/z/oExfzP:
struct Union
{
struct Empty {};
union {
Empty e;
};
void *dummy;
};
struct NoUniqueAddress
{
struct Empty {};
[[no_unique_address]] Empty e;
void *dummy;
};
These two structures do not have the same size and the offset of "dummy" in
each is also different. That means the choice of using [[no_unique_address]]
or not using it must be made RIGHT NOW and cannot be changed.
Let's say we're going to enable it now for Linux. Ok, good. Please make EVERY
SINGLE Qt build and user's application build unconditionally use
[[no_unique_address]] from now until 2028. Regardless of compiler choice (GCC,
Clang and ICC), compiler version and build flags.
Here's the patch. Add qglobal.h:
#if defined(Q_OS_LINUX) && !__has_cpp_attribute(no_unique_address)
# error "Your compiler is too old."
# error "Please upgrade so it supports [[no_unique_address]]."
#endif
I will give a +2 for this patch, since I prefer it. That means adding
properties doesn't imply an extra 8 bytes per class in the hierarchy. Imagine
a user class hierarcy like QSctpSocket -> QTcpSocket -> QAbstractSocket ->
QIODevice -> QObject. If each class has properties, that adds 40 bytes to the
full size of QSctpSocket.
[Yes, I know Qt-based classes should just put their properties in the d
pointer, but users don't usually have d pointers]
--
Thiago Macieira - thiago.macieira (AT) intel.com
Software Architect - Intel System Software Products
More information about the Development
mailing list