因此,在对性能敏感的应用程序中,有很多情况需要它,而我终于找到了压倒骆驼的稻草。它需要在 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 个 const 参数,它看起来像这样(未经测试):
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 中完美转发的常见蛮力方法。