1

そのため、パフォーマンスに敏感なアプリケーションでこれが必要になるケースがたくさんあり、私はついにラクダを壊した藁にいます。プラットフォームの少なくとも1つは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で完全に転送するための一般的なブルートフォースアプローチです。

4

3 に答える 3

3

ベクトルにメモリを事前に割り当てるには、を使用しますvector::reserve。これは、プリミティブ型だけでなく、すべての型で機能します。

要素を適切に構築するには、 Boost.Containersvector::emplace_backによって提供されるコンテナーまたはコンテナーの1つでC++11を使用する必要があります。

怠惰な構築が必要な場合(コンストラクターが高価であるため)std::vector<boost::optional>は、良い解決策です。

于 2012-03-07T09:00:06.740 に答える
1

あなたのコンパイラは、初期化を回避するのに十分賢いかもしれません。(すべてをインライン化し、このベクトルをローカルでのみ使用する場合、初期化が廃止されたと推測するのはそれほど複雑ではありません。)

さもないと:

パフォーマンスを重視し、固定サイズのバッファがある場合は、スタック上で配列を使用してみませんか? すなわち:

char buffer[1024];
size_t blen = read( someSource, buffer, sizeof(buffer) );

std::vectorその場合に導入されたヒープへの間接化も回避します。

その周りに独自のテンプレート コンテナを構築することもできます。

template<typename T = char, size_t MaxSize = 1024>
struct Buffer {
    static const size_t maxsize = MaxSize;
    typedef T type;
    type data[maxsize];
    size_t len;
    Buffer() : len(0) {}
};

そして、必要に応じて他の関数をそこに挿入します (STL コンテナーのようにするため)。

于 2012-03-09T01:07:40.030 に答える
0
v1.reserve( 200 );

予約を使用すると、サイズ変更の回数を減らすことができますMSDNで予約の詳細を参照してください

于 2012-03-07T09:03:46.597 に答える