Итак, есть масса случаев, когда это требовалось в приложениях, чувствительных к производительности, и я наконец-то оказался на соломинке, которая сломала верблюдов.Он должен быть скомпилирован в C ++ 98, так как по крайней мере одна из наших платформ гарантирует только соответствие C ++ 98.
Отредактировано, надеюсь, будет немного яснее с тем, что я хочу.
Пример:
// This will allocate storage for 1024, and then loop 1024 times touching all of it just to place a 0 in it
std::vector< char > buffer( 1024 );
// Now read will write into that buffer, overwriting the 0s ( we payed for the fill unnecessarily )
buffer.resize( read( someSource, &buffer[0], buffer.size() ) );
Это общий интерфейс C, используемый почти со всеми библиотеками C для записи данных в буфер.Те же проблемы возникают при работе с буферами, содержащими примитивы вообще.Вместо этого новое изменение размера будет выглядеть примерно так:
// Disabled for anything which doesn't pass boost::is_POD< T >, they get the standard version
void resize( size_t a_NewSize )
{
reserve( a_NewSize );
_end = _begin + a_NewSize;
}
construct_back будет конструктором пересылки, для 1 константного аргумента это будет выглядеть примерно так (непроверено):
template< typename T1 >
void construct_back( const T1& a_Arg1 )
{
if( capacity() <= size() ) // No room
reserve( size() + 1 );
// Construct in place using Ts constructor that accepts const T1&
new (&(*end()) T( T1 );
++_end; // Account for new element
}
construct_backдолжно иметь все возможное количество аргументов ^ 2 перегрузки, это общий метод грубой силы для идеальной пересылки в C ++ 98.