mem <int> </int>上的memset

时间:2013-04-08 09:45:13

标签: c++ vector stl memset

根据Mark Ransoms answer使用memset,我在vector<int>上使用memset为所有元素赋值。

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

它确实比std::fill有显着的性能提升,并且工作正常(g ++ 4.3.2,64位linux)。这个代码是否安全,如std :: vector实现总能保证数据的内存分配是连续的吗?是否有可能在未来(或不同)的stl库实现中,这可能会改变并在以后破坏我的代码?

3 个答案:

答案 0 :(得分:4)

  

将std :: vector实现始终保证内存   数据的分配将是连续的

是。 23.3.6.1/1。在C ++ 03标准中,23.2.4 / 1处的字符串相等

一个元素 向量是连续存储的,这意味着如果v是一个向量,其中T是某种类型的其他类型 对于所有0&lt; = n&lt;而不是bool,它遵循身份&amp; v [n] ==&amp; v [0] + n。 v.size()

  

是否有可能在未来(或不同)的实施中   stl库,这可能会改变并在以后破坏我的代码?

没有。矢量应该始终是连续的。

然而,在gcc 4.6.3中,使用memset只有一个填充优化。此优化适用于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);
    }

答案 1 :(得分:1)

从内存的角度来看,这应该是安全的。

请记住,如果向量的内容不是普通数据类型,则不应该做这种事情。

答案 2 :(得分:1)

memset使用bool类型的向量失败,只是尝试下面的示例,尽管正如其他提到的那样它适用于其他普通数据类型。我只是为了使它显式而不是所有普通数据类型都是真的。

#include <vector>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    vector<bool>vec;
    vec.push_back(0);
    vec.push_back(1);
    memset(&vec[0], 0, sizeof(vec[0]) * vec.size());
    return 0;
}