[Development] Passing QSize, QPoint, QTime and other small structs by value

Sergio Martins sergio.martins at kdab.com
Fri Apr 7 12:40:38 CEST 2017


Hi,


Some time ago I documented the guidelines on passing by value vs 
const-ref: 
https://wiki.qt.io/API_Design_Principles#Passing_by_const-ref_vs._Passing_by_value
This was discussed in #qt-labs at the time and informally +2'd there.

But the reality is that passing small structs by value is not very 
popular and Qt's API mostly passes them by const-ref.

I think this is a good time to have a more formal conversation, 
bikeshed+popcorn, then write a QUIP and hopefully change the API for Qt 
6.


The guideline is very simple:
- If your type has a non-trivial copy-CTOR or non-trivial DTOR then pass 
by const-ref, no matter how small it is, to avoid calling those methods. 
*[1]
- If your type has trivial CTOR and trivial DTOR, pass by value if it's 
small, otherwise const-ref. Small meaning <= 16 bytes.

The idea is that by value allows the struct's members to be passed in 
CPU registers, see [2] for extensive research.


The good news is, even if you don't care about raw performance, passing 
by value is more convenient, as you type less code, so IMO, more fun to 
use.


[1] - Shared pointers should go by value though, I'll try to prove it in 
the QUIP.
[2] - 
http://www.macieira.org/blog/2012/02/the-value-of-passing-by-value/





Cheers,
-- 
SĂ©rgio Martins | sergio.martins at kdab.com | Senior Software Engineer
Klarälvdalens Datakonsult AB, a KDAB Group company
Tel: Sweden (HQ) +46-563-540090, USA +1-866-777-KDAB(5322)
KDAB - The Qt, C++ and OpenGL Experts



More information about the Development mailing list