Нет гарантированной минимальной вместимости для std::string
. Вы можете запросить любую емкость, которую хотите, позвонив по номеру reserve
, но конкретная реализация гарантирует только установку емкости на некоторое количество, большее или равное запрошенному размеру.
Вот модифицированная версия вашей программы, которая тестирует несколько методов сжатия строк:
#include <string>
#include <iostream>
using namespace ::std;
template< typename S >
S & reserve_request( S & s, typename S::size_type n ) {
s.reserve( n ); return s;
}
template< typename S >
S & shrink_request1( S & s ) { s.reserve(); return s; }
template< typename S >
S & shrink_request2( S & s ) { S( s ).swap( s ); return s; }
template< typename S >
S & shrink_request3( S & s ) { S( s.c_str() ).swap( s ); return s; }
template< typename S >
void test( S & s ) { cout << s.capacity() << endl; }
int main() {
string temp = "1234567890123456"; // length 16
string str;
test( str ); // 15
test( reserve_request( str, 16 ) ); // 31
test( str += temp ); // 31
test( reserve_request( str, 16 ) ); // 31
test( shrink_request1( str ) ); // 31
test( shrink_request2( str ) ); // 31
test( shrink_request3( str ) ); // 31
return 0;
}
Может показаться, что Visual C ++ std::string
обычно сохраняет некоторую свободную емкость.
Если ваш проект загружает большое количество строк, считываемых из внешнего источника, размер которого никогда не изменяется, вам может быть лучше (как другие предлагали) хранить их в одном большом блоке символьной памяти, разделенной '\0'
символами (т. е. как C-струны). Если хотите, вы можете предоставить функции-оболочки, которые возвращают std::string
s на лету.