LINUX.ORG.RU

История изменений

Исправление 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/ядру лучше подскажут.