How to write entire QVector to a binary file?
-
@CJha said in How to write entire QVector to a binary file?:
I do not use const QVector<double>& because I want to depend on Qt's implicit sharing i.e. if the QVector<double> is changed while I am still using the previous QVector to write data in my binary file then it would not affect my "Writer" thread
So that you know, when passing your QVector through Qt::QueuedConnection - which is the default and correct one across threads - your QVector will be copied auto automatically, there will be no share until write. There will be a copy inside your thread
-
@J-Hilk Thanks, one thing which I am not sure about: What would happen if I use
const QVector<double>&
instead ofQVector<double>
, will it still copy the data if the connection type isQt:QueuedConnection
or will it just copy the reference for the vector?@CJha said in How to write entire QVector to a binary file?:
will it still copy the data if the connection type is Qt:QueuedConnection or will it just copy the reference for the vector?
In short: Yes they will be copied.
For more details take a look at this => https://www.embeddeduse.com/2013/06/29/copied-or-not-copied-arguments-signals-slots/ -
@CJha said in How to write entire QVector to a binary file?:
will it still copy the data if the connection type is Qt:QueuedConnection or will it just copy the reference for the vector?
In short: Yes they will be copied.
For more details take a look at this => https://www.embeddeduse.com/2013/06/29/copied-or-not-copied-arguments-signals-slots/@KroMignon Thanks :)
-
@KroMignon Thanks :)
@CJha
According to @KroMignon's linkThe conclusion from the above results is that we should pass arguments to signals and slots by const reference and not by value. This advice is true for both direct and queued connections. Even if the sender of the signal and the receiver of the slot are in different threads, we should still pass arguments by const reference.
If you have both signal & slot declared with
QVector<double> vec
and you change both to haveconst QVector<double>&
, you reduce 3 copies to 1.Having said that: I do get lost as to what gets copied, aren't we only talking about the
QVector
structure and not the data it references?? -
@CJha
According to @KroMignon's linkThe conclusion from the above results is that we should pass arguments to signals and slots by const reference and not by value. This advice is true for both direct and queued connections. Even if the sender of the signal and the receiver of the slot are in different threads, we should still pass arguments by const reference.
If you have both signal & slot declared with
QVector<double> vec
and you change both to haveconst QVector<double>&
, you reduce 3 copies to 1.Having said that: I do get lost as to what gets copied, aren't we only talking about the
QVector
structure and not the data it references?? -
@JonB If it's a copy then I assume it is always going to be the data because the structure is not that significant in terms of memory usage, but I am not sure about it either.
@CJha said in How to write entire QVector to a binary file?:
If it's a copy then I assume it is always going to be the data
No, because Qt containers use copy-on-write. See https://doc.qt.io/qt-5/implicit-sharing.html