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

Lars Knoll lars.knoll at qt.io
Fri Apr 7 15:02:55 CEST 2017


> On 7 Apr 2017, at 12:40, Sergio Martins <sergio.martins at kdab.com> wrote:
> 
> 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.

Those rules sound about right. We can do this nowadays, as x86 will become rather irrelevant for Qt 6 (where passing structs by reference would probably be better in most cases due to the limited amount of available registers).

There might be a little catch with regards to structs containing members that are 8 bytes in size (aka quint64). Are those getting passed in registers on 32bit ARM?

Cheers,
Lars

> 
> 
> 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
> _______________________________________________
> Development mailing list
> Development at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/development



More information about the Development mailing list