Я не уверен, задавалось ли это раньше, поэтому попробую.
У меня есть код для загрузки большого списка клиентов (200 тыс. Клиентов). Каждый клиент хранится в (в настоящее время) структуре фиксированного размера, которая содержит его имя, адрес и номер телефона следующим образом:
struct client {
char name[80];
char address[80];
char phonenumber[80];
};
Как видите, размер этой структуры составляет 240 байт. Таким образом, 200 тыс. Клиентов заняли бы 48 МБ памяти. Очевидно, что преимуществами такой структуры является простота управления и создание «свободного списка» для утилизации клиентов. Однако если завтра мне потребуется загрузить 5M клиентов, это увеличит объем оперативной памяти до 1,2 ГБ.
Теперь, очевидно, в большинстве случаев имя, адрес и номер телефона клиента занимают намного меньше 80 байт, поэтому вместо вышеупомянутой структуры я подумал об использовании структуры как следующее:
struct client {
char *name;
char *address;
char *phonenumber;
};
И затем * name, * address и * phonenumber указывают на динамически распределенные структуры с точным необходимым размером для хранения каждой информации.
Однако я подозреваю, что чем больше клиентов будет загружено таким образом, это значительно увеличит количество новых выделенных ресурсов [] и delete [], и мой вопрос в том, может ли это в какой-то момент повлиять на производительность, например, если я хочу внезапно удалить 500 КБ клиентов 1 МБ и заменить их на 350 КБ различных клиентов?
Я подозреваю, выделил ли я 1 МБ небольших буферов «переменной длины», если я «удалю» многие из них а затем хотите создать новые распределения, которые будут перерабатывать те, которые были удалены, не вызовет ли это сом накладные расходы, чтобы распределитель мог их найти?