C++ векторы и память 🤔

C++ — моя любовь. Я ❤️ С++. Многие люди думают, что C++ уродлив и ужасен в работе, поэтому я решил, почему бы не создать серию статей, которые помогут расчистить путь и разобраться в прекрасных причудах языка 😍.

В этом уроке мы будем работать со стандартной библиотекой шаблонов C++ Vectors и с тем, как она связана с памятью.

В C++ вы можете включить библиотеку с именем vector в дополнение к стандартной стандартной библиотеке iostream C++.

#include – это директива препроцессора, которая сообщает компилятору о включении любой следующей библиотеки, в нашем случае это стандартная векторная библиотека. Поскольку мы будем работать со стандартной библиотекой шаблонов, мы будем использовать стандартное пространство имен, что облегчит нам жизнь.

#include <iostream>
#include <vector>
using namespace std;

Размер против емкости

Во-первых, размер НЕ совпадает с емкостью. Размер вектора — это количество элементов в векторе, тогда как емкость — это количество элементов, для которых выделена память.

vector<int> vec;
int capacity = vec.capacity(); // Retrieving the capacity
int size = vec.size(); // Retrieving the size

В большинстве случаев, когда мы говорим о служебных данных вектора, мы имеем в виду выделенную память, емкость вектора.

Схема увеличения емкости

Разные компиляторы используют разные инкрементные схемы, будь то удвоение (1,2,4, 8, 16, 32, 64…) или какая-то другая схема, которая устанавливает емкость, равную или превышающую размер вектора. Наиболее распространенной схемой увеличения емкости векторов является удвоение.

Тайно массив

Под капотом вектор представляет собой массив, который автоматически изменяет свой размер после заполнения массива. Как только емкость будет достигнута, в вашей программе будет пауза, пока элементы будут скопированы в новый массив с большей емкостью.

Когда это имеет значение? — Вопросы эффективности

Если у вас есть проблемы с эффективностью или вы знаете, что вам нужно только несколько выбранных мест, вы можете зарезервировать это выбранное количество мест вместо того, чтобы компилятор резервировал произвольно большой объем памяти.

vec.reserve(34)  // Allocates memory for 34 elements

Важно отметить, что если ваш вектор больше, чем сумма, которую вы пытаетесь зарезервировать, ваш вектор будет сокращен до определенной вами суммы.

Одна из прелестей C++ — возможность управлять памятью, чтобы сделать ваши программы эффективными. Резервный метод — отличный пример того, как можно использовать C++ для создания эффективных программ. Это особенно полезно при создании игр и необходимости минимизировать выделение памяти, где это возможно.

C++ предназначен для того, чтобы вы могли выражать идеи, но если у вас нет идей или вы не имеете ни малейшего представления о том, как их выразить, C++ не предлагает большой помощи.
Бьерн Страуструп (создатель C++)

На этом все. Следите за мной в Интернете @thetealpickle