5

memsetの使用に関するMark Ransomsの回答によると、私はmemsetを使用しvector<int>てすべての要素に値を割り当てています。

memset(&match_begin[0], 0xff , sizeof(match_begin[0]) * match_begin.size());

パフォーマンスが大幅に向上しstd::fill、正常に動作します (g++ 4.3.2、64 ビット Linux)。のように、このコードは安全ですか? std::vector 実装は、データのメモリ割り当てが連続することを常に保証しますか? stl ライブラリの将来の (または別の) 実装で、これが変更され、後でコードが壊れる可能性はありますか?

4

3 に答える 3

5

std::vector 実装は、データのメモリ割り当てが連続することを常に保証します

はい。23.3.6.1/1 . C++03 標準では、23.2.4/1 に等しい文字列があります。

ベクトルの要素は連続して格納されます。つまり、T が bool 以外の型の場合、v がベクトルである場合、すべての 0 <= n < v に対して恒等式 &v[n] == &v[0] + n に従います。 。サイズ()

stl ライブラリの将来の (または別の) 実装で、これが変更され、後でコードが壊れる可能性はありますか?

いいえ。ベクトルは常に連続している必要があります。

ただし、gcc 4.6.3 では、memset を使用して、fill の最適化が 1 つしかありません。この最適化は char 型用です

  // Specialization: for char types we can use memset.
  template<typename _Tp>
    inline typename
    __gnu_cxx::__enable_if<__is_byte<_Tp>::__value, void>::__type
    __fill_a(_Tp* __first, _Tp* __last, const _Tp& __c)
    {
      const _Tp __tmp = __c;
      __builtin_memset(__first, static_cast<unsigned char>(__tmp),
               __last - __first);
    }
于 2013-04-08T09:47:32.033 に答える
1

これは、メモリの観点から安全なはずです。

ベクトルの内容が単純なデータ型でない場合は、この種のことを行うべきではないことに注意してください。

于 2013-04-08T09:50:49.740 に答える