Вы можете легко увидеть поведение вашей реализации, вызвав
std::string::capacity
в разное время. В общем, я бы удивился
если любая реализация когда-либо имела буфер из трех символов. (Не
слова, но байты, по крайней мере, на большинстве современных машин.) На практике,
реализации варьируются, а также различаются в зависимости от того, как новая длина
происходит с помощью g ++, например, удаление символов с
std::string::erase
не уменьшит емкость строки, но
назначение новой, меньшей строки будет. VC ++ не уменьшает емкость
в любом случае. (В общем, VC ++ и g ++ имеют очень разные
стратегии в отношении управления памятью в строках.)
EDIT:
Учитывая другие ответы (которые даже не соответствуют обычным
практика): вот небольшая тестовая программа, которую я использовал для проверки своих утверждений
выше (хотя мне действительно не нужно это для g ++ & mdash; я знаю
внутренности реализации неплохо):
#include <string>
#include <iostream>
#include <iomanip>
template<typename Traits>
void
test()
{
std::string s;
size_t lastSeen = -1;
std::cout << Traits::name() << ": Ascending:" << std::endl;
while ( s.size() < 150 ) {
if ( s.capacity() != lastSeen ) {
std::cout << " " << std::setw( 3 ) << s.size()
<< ": " << std::setw( 3 ) << s.capacity() << std::endl;
lastSeen = s.capacity();
}
Traits::grow( s );
}
std::cout << Traits::name() << ": Descending: " << std::endl;
while ( s.size() != 0 ) {
Traits::shrink( s );
if ( s.capacity() != lastSeen ) {
std::cout << " " << std::setw( 3 ) << s.size()
<< ": " << std::setw( 3 ) << s.capacity() << std::endl;
lastSeen = s.capacity();
}
}
std::cout << "Final: capacity = " << s.capacity() << std::endl;
}
struct Append
{
static void grow( std::string& s )
{
s += 'x';
}
static void shrink( std::string& s )
{
s.erase( s.end() - 1 );
}
static std::string name()
{
return "Append";
}
};
struct Assign
{
static void grow( std::string& s )
{
s = std::string( s.size() + 1, 'x' );
}
static void shrink( std::string& s )
{
s = std::string( s.size() - 1, 'x' );
}
static std::string name()
{
return "Assign";
}
};
int
main()
{
test<Append>();
test<Assign>();
return 0;
}
Попробуй. Результаты весьма поучительны.