向量上的 memset<int>

Posted

技术标签:

【中文标题】向量上的 memset<int>【英文标题】:memset on vector<int> 【发布时间】:2013-04-08 09:45:12 【问题描述】:

根据Mark Ransoms answer 使用memset,我在vector&lt;int&gt; 上使用memset 为所有元素分配值。

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

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

【问题讨论】:

std::fill 显然更干净,考虑memset 的唯一原因是性能。你是如何衡量性能差异的? gcc 有一个优化,可以识别类似 memset 的循环并用对 memset 的调用替换它们。 @Marc,在我的函数中,我不小心同时放入了 memset 和 fill。实际上在性能上没有任何可见的差异。我的代码读取 tcp 流中的每个数据包。通过发送一个大文件并测量时间,我对性能有了一个基本的了解。 【参考方案1】:

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

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

一个元素 向量是连续存储的,这意味着如果 v 是一个向量,而 T 是其他类型 比布尔值,那么它服从所有 0

的恒等式 &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);
    

【讨论】:

我在哪里可以找到任何可以验证这一点的文档? 虽然我觉得你说得对,但你还能提供一些来源吗? 感谢您提供的部分编号,但您从哪里获取此信息?能给个链接吗? @MIkhail 我只是把链接放在那里。【参考方案2】:

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

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

【讨论】:

是的,没错。它必须是 POD。【参考方案3】:

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;

【讨论】:

以上是关于向量上的 memset<int>的主要内容,如果未能解决你的问题,请参考以下文章

在 2D int 向量上使用 std::fill

使用 memset 初始化包含数组的结构向量

memset向量为0会导致内存泄漏吗?

堆上的整数向量和释放内存

多向量上的函数

将向量初始化添加到结构构造函数