Программирование на языках Фортран, C++,Java,Qt и других
Программирование на языках Фортран, C++,Java,Qt и других













На главную



Управление памятью


Иногда эффективное использование памяти в большей степени влияет на производительность программы, чем эффективное использование ресурсов процессора. Действительно, проблемы с доступной памятью могут существенно замедлить выполнение программы из-за того, что процессор будет занят страничным обменом с областью виртуальной памяти на диске, вместо того чтобы выполнять программу. Ниже приведены полезные советы о том, как повысить эффективность использования памяти компьютера с помощью средств стандартной библиотеки.

Шаблоны классов vector и string предоставляют две функции управления выделением и распределением памяти для элементов контейнера. При правильном использовании эти функции позволяют оптимизировать затраты памяти на сохранение данных в контейнере.

Функция capacity возвращает емкость контейнера- число элементов или символов, которые еще можно сохранить в контейнере без дополнительного выделения памяти. Если в ходе выполнения программы объекты vector или string исчерпают свой ресурс, то для них может быть выделено слишком много дополнительной памяти, в результате чего значение capacity () существенно превысит значение size (). Это свидетельствует о неэффективном перерасходе памяти. Если объемы контейнеров будут приращиваться очень мелкими порциями, то программа будет затрачивать слишком много времени на частое выделение новых областей памяти и копирование в них текущего содержимого.

Управлять емкостью контейнера можно с помощью функции reserve. Если вам приблизительно известен размер вектора или строки, то можно зарезервировать ровно столько памяти, сколько потребуется, чтобы предупредить ее перерасход. Если приблизительный размер не известен и в ходе выполнения программы предполагается стремительный рост элементов контейнера, с помощью reserve можно предупредить слишком частые обращения программы за новыми порциями памяти. Если значение аргумента, переданного в функцию reserve, меньше текущего числа элементов, то вызов функции игнорируется. В листинге 11.3 показано использование функции reserve для предварительного резервирования памяти.

Листинг 11.3. Предварительное резервирование памяти для вектора

l:#include

2:#include

3:#include

4:

5:int main()

6:{

7: // Заполнение вектора значениями квадратов первой тысячи

// целых чисел

std::vector result;

result.reserve(10000);

for (long i = 1; i <= 10000; ++i) result.push back(i * i);

std::cout " "Size = ** " result. size ()

" ",capacity = " << result.capacity() << std::endl;

// Проверка соответствия размера контейнера его емкости assert(result.size() == result.capacity());

return 0;

}

Функцию reserve можно использовать для уменьшения объема памяти, выделенной для объекта string, но не для вектора. Емкость вектора невозможно уменьшить. Если нужно освободить память, занимаемую вектором, то классическим решением будет вызов функции swap для замены текущего вектора на пустой (листинг 11.4).

Листинг 11.4. Использование функции swap для очистки вектора

template void freeVector{std::vector& v)

{

std::vector empty; v. swap (empty) ;

Еще одна интересная возможность использования функции reserve состоит в том, что с ее помощью можно предупредить возникновение бессмысленного итератора. Так, функция pushjback вектора не сделает бессмысленным никакой итератор, если size () будет меньше, чем capacity ().

Сравнить цены и выбрать, духовой шкаф волгоград.



Комментарии:

Добавить комментарий:

Ник
Текст
Контрольное число *