5

根据Mark Ransoms关于使用 memset 的回答,我在 a 上使用 memsetvector<int>为所有元素分配值。

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

它确实有显着的性能改进std::fill并且运行良好(g++ 4.3.2, 64bit linux)。这段代码是否安全,如中所示,std::vector 实现是否总是保证数据的内存分配是连续的?是否有可能在 stl 库的未来(或不同)实现中,这可能会在以后更改并破坏我的代码?

4

3 回答 3

5

std::vector 实现是否总是保证数据的内存分配是连续的

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

向量的元素是连续存储的,这意味着如果 v 是一个向量,其中 T 是 bool 以外的某种类型,那么对于所有 0 <= n < v,它都遵循恒等式 &v[n] == &v[0] + n 。尺寸()

是否有可能在 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);
    }
于 2013-04-08T09:47:32.033 回答
1

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

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

于 2013-04-08T09:50:49.740 回答
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;
}
于 2013-04-08T09:57:56.597 回答