История изменений
Исправление yoghurt, (текущая версия) :
Я думаю, они вот о чём.
Допустим, изначальный объем памяти под вектор - 2 байта. Добавляя в него элементы, он будет периодически переаллоцироваться такими шагами:
2, 4, 8, 16
Допустим, нам нужно опять его переаллоцировать, и с множителем 2 мы должны выделить 32 байта. Предыдущие чанки в сумме дают
2 + 4 + 8 + 16 = 30
30 байт, поэтому мы не можем их использовать повторно, нам нужны новые 32. 2 байта, как начальный размер - плохой пример, с 1024 байтами уже всё становится наглядней :)
С множителем «1.5» имеем (округляя до целого):
2, 3, 5, 8
Т.е. следующий выделяемый размер меньше суммы предыдущих, и возможно аллокатор использует предыдущие чанки для этого.
Я не знаю, как происходит выделение памяти на самом деле, тут уже специалисты по libc/ядру лучше подскажут.
Исходная версия yoghurt, :
Я думаю, они вот о чём.
Допустим, изначальный объем памяти под вектор - 2 байта. Добавляя в него элементы, он будет периодически переаллоцироваться такими шагами:
2, 4, 8, 16
Допустим, нам нужно опять его переаллоцировать, и с множителем 2 мы должны выделить 32 байта. Предыдущие чанки в сумме дают
2 + 4 + 8 + 16 = 30
30 байт, поэтому мы не можем их использовать повторно, нам нужны новые 32. 2 байта, как начальный размер - плохой пример, с 1024 байтами уже всё становится наглядней :)
С множителем «1.5» имеем (округляя до целого):
2, 3, 5, 7
Т.е. следующий выделяемый размер меньше суммы предыдущих, и возможно аллокатор использует предыдущие чанки для этого.
Я не знаю, как происходит выделение памяти на самом деле, тут уже специалисты по libc/ядру лучше подскажут.