Почему std::vector.push_back(new struct()) работает медленнее чем std::vector.push_back(struct_item)

191
19 ноября 2021, 14:20

хочу хранить в векторе некоторые структуры,(много). Интересует вопрос почему такой код работает быстрее

struct A{
    uint64_t a1;
    uint8_t a2[12];
};
    {
        std::vector<A> *stdArray = new std::vector<A>;
        A temp;
        stdArray->reserve(SIZE);
        for(int ind=0;ind<SIZE;++ind){
            temp.a1= ind;
            stdArray->push_back(temp);
        }
    }

Чем такой:

{
    std::vector<A*> *stdArray = new std::vector<A*>;
    stdArray->reserve(SIZE);
    for(int ind=0;ind<SIZE;++ind)
        stdArray->push_back(new A());
}

В первом случае вызывается конструктор копирования а во втором нет, почему первое быстрее?

И еще вопрос, пытаюсь выделить память под ~20000000 элементов QVector крашит программу с ошибкой выделения памяти, 32х компилятор MinGW, при этом std vector работает но медленнее, не пытаюсь выделить памяти больше разрешенных на 32х битах, никто не сталкивался? Почему QVector не хочет хранить столько же данных как std vector?

Answer 1

Менеджер памяти - не самая быстрая система, так что основные потери времени у вас на

new A()

Конкретнее - на выделении памяти, обновлении массы служебных структур менеджера памяти и т.п., что по времени выполняется дольше, чем простое копирование 20 байт...

READ ALSO
Ошибка при трансяции потока через хромкаст cast_sender.js

Ошибка при трансяции потока через хромкаст cast_sender.js

Добавляю хромкаст согласно туториалу

189
Ожидание загрузки изображения в цикле для ротации изображений [дубликат]

Ожидание загрузки изображения в цикле для ротации изображений [дубликат]

Для одного функционала требуется сделать ротатор изображений, но не по обычному таймауту, а по таймауту после загрузки и показа изображения,...

93
Прервать цикл дойдя до блока в dom

Прервать цикл дойдя до блока в dom

Помогите пожалуйста с идеей, есть верстка, в очень упрощенном виде так:

68