Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QList<QVector< . >>: how to reserve
Forum Updated to NodeBB v4.3 + New Features

QList<QVector< . >>: how to reserve

Scheduled Pinned Locked Moved Solved General and Desktop
15 Posts 4 Posters 911 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Davide87

    Hello everybody.

    In my application I have to manage several vectors of float numbers and I figured I would organize them in a QList.
    Since such vectors may become quite large (several kbytes up to few Mbytes each), I though it would be better to use the reserve() function to avoid memory issues.

    If, for example, I want N vectors with maximum allowed size M, what is the best way to reserve my memory for it?

    For context, I have in my mainwindow.h

    QList<QVector<float>*> *myList;
    

    and in mainwindow.cpp

    int N = ...
    int M = ...
    
    myList = new QList<QVector<float>*>();
    

    After that, what is the best way to reserve myList?

    myList->clear();
    myList->reserve(N);
    
    for(int i=0; i<N; i++)
    {
        myList->append(new QVector<float>());
        myList->at(i)->reserve(M);
    }
    

    or should I myList->reserve(N*M);?
    (consider that M may be several thousends)

    Are there better ways to do it that I didn't consider?

    Christian EhrlicherC Offline
    Christian EhrlicherC Offline
    Christian Ehrlicher
    Lifetime Qt Champion
    wrote on last edited by
    #2

    @Davide87 said in QList<QVector< . >>: how to reserve:

    QList<QVector<float>*> *myList;

    Why a pointer here? Unneeded

    or should I myList->reserve(N*M);?

    It depends on how many items you want to insert into the subvectors - from your descriptions they contain max 'M' elements so why would you reserve N*M then?

    Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
    Visit the Qt Academy at https://academy.qt.io/catalog

    1 Reply Last reply
    1
    • D Davide87

      Hello everybody.

      In my application I have to manage several vectors of float numbers and I figured I would organize them in a QList.
      Since such vectors may become quite large (several kbytes up to few Mbytes each), I though it would be better to use the reserve() function to avoid memory issues.

      If, for example, I want N vectors with maximum allowed size M, what is the best way to reserve my memory for it?

      For context, I have in my mainwindow.h

      QList<QVector<float>*> *myList;
      

      and in mainwindow.cpp

      int N = ...
      int M = ...
      
      myList = new QList<QVector<float>*>();
      

      After that, what is the best way to reserve myList?

      myList->clear();
      myList->reserve(N);
      
      for(int i=0; i<N; i++)
      {
          myList->append(new QVector<float>());
          myList->at(i)->reserve(M);
      }
      

      or should I myList->reserve(N*M);?
      (consider that M may be several thousends)

      Are there better ways to do it that I didn't consider?

      JonBJ Online
      JonBJ Online
      JonB
      wrote on last edited by
      #3

      @Davide87 said in QList<QVector< . >>: how to reserve:

      or should I myList->reserve(N*M);?

      No, the QList and QVector are quite separate from one another, not related. Any reservations must be done on each one separately, and for the elements of the list which are vectors in each vector individually, as your code does.

       myList->at(i)->reserve(M);
      

      Not sure you will be able to do this (or have you already done it and it compiles)? const T &QList::at(int i) const returns a const reference to the (QVector) element, so you won't be able to call QList::reserve() on it? Create a temporary for the new QVector<float>(), call reserve() on that, then add it to your QList.

      Christian EhrlicherC J.HilkJ 2 Replies Last reply
      0
      • JonBJ JonB

        @Davide87 said in QList<QVector< . >>: how to reserve:

        or should I myList->reserve(N*M);?

        No, the QList and QVector are quite separate from one another, not related. Any reservations must be done on each one separately, and for the elements of the list which are vectors in each vector individually, as your code does.

         myList->at(i)->reserve(M);
        

        Not sure you will be able to do this (or have you already done it and it compiles)? const T &QList::at(int i) const returns a const reference to the (QVector) element, so you won't be able to call QList::reserve() on it? Create a temporary for the new QVector<float>(), call reserve() on that, then add it to your QList.

        Christian EhrlicherC Offline
        Christian EhrlicherC Offline
        Christian Ehrlicher
        Lifetime Qt Champion
        wrote on last edited by
        #4

        @JonB said in QList<QVector< . >>: how to reserve:

        Create a temporary for the new QVector<float>(), call reserve() on that, then add it to your QList.

        or use operator[] :)

        Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
        Visit the Qt Academy at https://academy.qt.io/catalog

        JonBJ 1 Reply Last reply
        0
        • Christian EhrlicherC Christian Ehrlicher

          @JonB said in QList<QVector< . >>: how to reserve:

          Create a temporary for the new QVector<float>(), call reserve() on that, then add it to your QList.

          or use operator[] :)

          JonBJ Online
          JonBJ Online
          JonB
          wrote on last edited by JonB
          #5

          @Christian-Ehrlicher
          I could have suggested that, but to me I should not have to think about how I am addressing the element in the list ([] vs at()) when all I want to do is set reserve() on the QVector I am adding. I also have a feeling it will be 1 nanosecond slower to do it via []/on an element I have already put into the list than if I do it do it beforehand (though i amy be wrong on this)... ;-)

          If you can afford to actually create all the elements (value 0.0) initially and overwrite them instead of reserve()ing (because it will be fixed size), Qt6 at least seems to have QList::QList(qsizetype size) constructor which you can use.

          1 Reply Last reply
          0
          • D Offline
            D Offline
            Davide87
            wrote on last edited by
            #6

            Thank you guys.

            @Christian-Ehrlicher
            In my application N is in the order of few tens. The subvectors may be instead hundreds or thousands of elements, depending on the configuration of the hardware that sends me the data to store/display.
            I thought I may have to reserve the list depending on the actual maximum number of bytes it is going to contain.
            The size of the vectors can vary, but I would prefer to set a maximum size to avoid my application to take too much memory.

            @JonB
            myList->at(i)->reserve(M); compiles without issues.
            I'm actually having some memory issues in my application, but they are probably related to other parts of may code. That's why I opened this topic.

            JonBJ 1 Reply Last reply
            0
            • D Davide87

              Thank you guys.

              @Christian-Ehrlicher
              In my application N is in the order of few tens. The subvectors may be instead hundreds or thousands of elements, depending on the configuration of the hardware that sends me the data to store/display.
              I thought I may have to reserve the list depending on the actual maximum number of bytes it is going to contain.
              The size of the vectors can vary, but I would prefer to set a maximum size to avoid my application to take too much memory.

              @JonB
              myList->at(i)->reserve(M); compiles without issues.
              I'm actually having some memory issues in my application, but they are probably related to other parts of may code. That's why I opened this topic.

              JonBJ Online
              JonBJ Online
              JonB
              wrote on last edited by JonB
              #7

              @Davide87 said in QList<QVector< . >>: how to reserve:

              @JonB
              myList->at(i)->reserve(M); compiles without issues.

              @Christian-Ehrlicher could you explain, am I having a mind block? Given it's const T &QList::at(int i) const, doesn't the const T & prevent me from calling QList::reserve() on it?

              @Davide87
              I still suspect reserve() won't make that much difference, Qt's list/vector allocation will be reasonable even without it. You would have to test.

              The size of the vectors can vary, but I would prefer to set a maximum size to avoid my application to take too much memory.

              I don't think reserve() will have any effect on the maximum size of the list/vector. That will happen dynamically whether you reserve or not. It's only to do with efficient use of memory during re-allocations as list grows.

              Christian EhrlicherC D 2 Replies Last reply
              0
              • JonBJ JonB

                @Davide87 said in QList<QVector< . >>: how to reserve:

                @JonB
                myList->at(i)->reserve(M); compiles without issues.

                @Christian-Ehrlicher could you explain, am I having a mind block? Given it's const T &QList::at(int i) const, doesn't the const T & prevent me from calling QList::reserve() on it?

                @Davide87
                I still suspect reserve() won't make that much difference, Qt's list/vector allocation will be reasonable even without it. You would have to test.

                The size of the vectors can vary, but I would prefer to set a maximum size to avoid my application to take too much memory.

                I don't think reserve() will have any effect on the maximum size of the list/vector. That will happen dynamically whether you reserve or not. It's only to do with efficient use of memory during re-allocations as list grows.

                Christian EhrlicherC Offline
                Christian EhrlicherC Offline
                Christian Ehrlicher
                Lifetime Qt Champion
                wrote on last edited by
                #8

                @JonB said in QList<QVector< . >>: how to reserve:

                Given it's const T &QList::at(int i) const, doesn't the const T & prevent me from calling QList::reserve() on it?

                Because he is working with heap-allocated QList/QVector instances for unknown reaons / he wants to debug memory leaks later on because he forgets to delete them afterwards...

                Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                Visit the Qt Academy at https://academy.qt.io/catalog

                1 Reply Last reply
                1
                • JonBJ JonB

                  @Davide87 said in QList<QVector< . >>: how to reserve:

                  @JonB
                  myList->at(i)->reserve(M); compiles without issues.

                  @Christian-Ehrlicher could you explain, am I having a mind block? Given it's const T &QList::at(int i) const, doesn't the const T & prevent me from calling QList::reserve() on it?

                  @Davide87
                  I still suspect reserve() won't make that much difference, Qt's list/vector allocation will be reasonable even without it. You would have to test.

                  The size of the vectors can vary, but I would prefer to set a maximum size to avoid my application to take too much memory.

                  I don't think reserve() will have any effect on the maximum size of the list/vector. That will happen dynamically whether you reserve or not. It's only to do with efficient use of memory during re-allocations as list grows.

                  D Offline
                  D Offline
                  Davide87
                  wrote on last edited by
                  #9

                  @JonB said in QList<QVector< . >>: how to reserve:

                  @Davide87 said in QList<QVector< . >>: how to reserve:

                  @JonB
                  myList->at(i)->reserve(M); compiles without issues.

                  @Christian-Ehrlicher could you explain, am I having a mind block? Given it's const T &QList::at(int i) const, doesn't the const T & prevent me from calling QList::reserve() on it?

                  It may be because myList is a list of pointers. QList::at(int i) returns a pointer in this case. Therefore ->reserve() works in this case. Maybe.

                  @Davide87
                  I still suspect reserve() won't make that much difference, Qt's list/vector allocation will be reasonable even without it. You would have to test.

                  The size of the vectors can vary, but I would prefer to set a maximum size to avoid my application to take too much memory.

                  I don't think reserve() will have any effect on the maximum size of the list/vector. That will happen dynamically whether you reserve or not. It's only to do with efficient use of memory during re-allocations as list grows.

                  Ok, thank you. I will test that.

                  JonBJ 1 Reply Last reply
                  0
                  • D Davide87

                    @JonB said in QList<QVector< . >>: how to reserve:

                    @Davide87 said in QList<QVector< . >>: how to reserve:

                    @JonB
                    myList->at(i)->reserve(M); compiles without issues.

                    @Christian-Ehrlicher could you explain, am I having a mind block? Given it's const T &QList::at(int i) const, doesn't the const T & prevent me from calling QList::reserve() on it?

                    It may be because myList is a list of pointers. QList::at(int i) returns a pointer in this case. Therefore ->reserve() works in this case. Maybe.

                    @Davide87
                    I still suspect reserve() won't make that much difference, Qt's list/vector allocation will be reasonable even without it. You would have to test.

                    The size of the vectors can vary, but I would prefer to set a maximum size to avoid my application to take too much memory.

                    I don't think reserve() will have any effect on the maximum size of the list/vector. That will happen dynamically whether you reserve or not. It's only to do with efficient use of memory during re-allocations as list grows.

                    Ok, thank you. I will test that.

                    JonBJ Online
                    JonBJ Online
                    JonB
                    wrote on last edited by
                    #10

                    @Davide87 said in QList<QVector< . >>: how to reserve:

                    It may be because myList is a list of pointers. QList::at(int i) returns a pointer in this case. Therefore ->reserve() works in this case. Maybe.

                    Ah, yes indeed, I did not notice that. Only the pointer is const then, it does not make *const_pointer be const :)

                    1 Reply Last reply
                    0
                    • Christian EhrlicherC Offline
                      Christian EhrlicherC Offline
                      Christian Ehrlicher
                      Lifetime Qt Champion
                      wrote on last edited by
                      #11

                      Again: don't use pointers here - they are completely unneeded and will get you in trouble later on when you hunt for memory leaks

                      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                      Visit the Qt Academy at https://academy.qt.io/catalog

                      1 Reply Last reply
                      1
                      • D Offline
                        D Offline
                        Davide87
                        wrote on last edited by
                        #12

                        Ok Christian. Thank you.

                        1 Reply Last reply
                        0
                        • D Davide87 has marked this topic as solved on
                        • JonBJ JonB

                          @Davide87 said in QList<QVector< . >>: how to reserve:

                          or should I myList->reserve(N*M);?

                          No, the QList and QVector are quite separate from one another, not related. Any reservations must be done on each one separately, and for the elements of the list which are vectors in each vector individually, as your code does.

                           myList->at(i)->reserve(M);
                          

                          Not sure you will be able to do this (or have you already done it and it compiles)? const T &QList::at(int i) const returns a const reference to the (QVector) element, so you won't be able to call QList::reserve() on it? Create a temporary for the new QVector<float>(), call reserve() on that, then add it to your QList.

                          J.HilkJ Offline
                          J.HilkJ Offline
                          J.Hilk
                          Moderators
                          wrote on last edited by
                          #13

                          @JonB said in QList<QVector< . >>: how to reserve:

                          No, the QList and QVector are quite separate from one another, not related

                          alt text

                          Not in Qt6

                          https://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/tools/qvector.h

                          you're technically correct in relation to the OP post. And technically correct is the best kind of correct


                          Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                          Q: What's that?
                          A: It's blue light.
                          Q: What does it do?
                          A: It turns blue.

                          JonBJ 1 Reply Last reply
                          3
                          • J.HilkJ J.Hilk

                            @JonB said in QList<QVector< . >>: how to reserve:

                            No, the QList and QVector are quite separate from one another, not related

                            alt text

                            Not in Qt6

                            https://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/tools/qvector.h

                            you're technically correct in relation to the OP post. And technically correct is the best kind of correct

                            JonBJ Online
                            JonBJ Online
                            JonB
                            wrote on last edited by JonB
                            #14

                            @J-Hilk
                            I did not say QList and QVector are not related to one another! I said THE QList and THE QVector in OP's

                            QList<QVector<float>*> *myList;
                            

                            declaration are unrelated to each other (Qt4, 5, 6 or anything else). The OP asked whether

                            or should I myList->reserve(N*M);?

                            where he thinks a list/vector of lists/vectors are "one blob" which can be reserved like that....

                            J.HilkJ 1 Reply Last reply
                            0
                            • JonBJ JonB

                              @J-Hilk
                              I did not say QList and QVector are not related to one another! I said THE QList and THE QVector in OP's

                              QList<QVector<float>*> *myList;
                              

                              declaration are unrelated to each other (Qt4, 5, 6 or anything else). The OP asked whether

                              or should I myList->reserve(N*M);?

                              where he thinks a list/vector of lists/vectors are "one blob" which can be reserved like that....

                              J.HilkJ Offline
                              J.HilkJ Offline
                              J.Hilk
                              Moderators
                              wrote on last edited by
                              #15

                              @JonB

                              @J-Hilk said in QList<QVector< . >>: how to reserve:

                              you're technically correct in relation to the OP post. And technically correct is the best kind of correct


                              Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                              Q: What's that?
                              A: It's blue light.
                              Q: What does it do?
                              A: It turns blue.

                              1 Reply Last reply
                              3

                              • Login

                              • Login or register to search.
                              • First post
                                Last post
                              0
                              • Categories
                              • Recent
                              • Tags
                              • Popular
                              • Users
                              • Groups
                              • Search
                              • Get Qt Extensions
                              • Unsolved