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.mart...@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@qt-project.org
http://lists.qt-project.org/mailman/listinfo/development

Reply via email to