Я считаю, что это связано с простым, хотя и несколько глупым, способом обеспечить угловой регистр очень маленьких строк.
Например, если у меня есть строка
""
и я только удваиваю его, у меня не будет достаточного размера, чтобы хранить в нем что-либо еще. Если я удвою его и добавлю небольшое постоянное количество пробелов, я могу гарантировать, что мое новое значение больше, чем мое старое.
Зачем тогда увеличивать его на два? Вероятно небольшое улучшение производительности. Добавляя два вместо 1, я могу избежать промежуточного расширения для небольших расширений (от 0 до 10 символов, подробно описанных ниже).
"" => expand => "1" => expand => "123" expand => "1234567" expand => "123456789012345"
что в 4 раза больше по сравнению с
"" => expand => "12" => expand => "123456" => expand => "123456789012"
который 3 расширяется. Это также хорошо работает для строк с одним символом (расширяется до 10 символов)
"1" => expand => "1234" => expand => "1234567890"
в то время как процедура расширения 1 char выглядит как
"1" => expand => "123" => expand => "1234567" => expand => "123456789012345"
Наконец, добавление приращения на два приводит к выравниванию слов примерно в 50 % случаев, в то время как добавление приращения на один или три приводит к выравниванию примерно в 25 % случаев. Хотя это может показаться не таким уж большим делом, некоторые архитектуры не могут поддерживать невыровненные чтения без дорогостоящих вызовов прерываний для перезаписи чтения в ЦП, что приводит к всевозможным проблемам с производительностью.
person
Edwin Buck
schedule
17.07.2017
int newCapacity = (value.length + 1) * 2;
Разве недостаточно просто(value.length) * 2;
? Вот что мне интересно. - person Philip Paek   schedule 14.07.2017(value.length + 1) * 2
. Я имею в виду, используется ли он как есть где-то? - person prime   schedule 14.07.2017int newCapacity = value.length * 2 + 2;
- person prime   schedule 14.07.2017int newCapacity = (value.length + 1) * 2
; Добавьте дополнительный пробел и удвойте его. Это имеет смысл, так как емкость заполнена, просто добавьте ОДИН дополнительный пробел, а затем удвойте новую длину. - person Den Isahac   schedule 17.07.2017