2013-04-08 93 views
4

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

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

它有超过std::fill一个显著的性能提升,它工作正常(G ++ 4.3.2,64位版)。这个代码是否安全,就像std :: vector的实现一样总能保证数据的内存分配是连续的?是否有可能在未来(或不同)的stl库实现中,这可能会改变并在以后中断我的代码?

+0

'std :: fill'明显更干净,考虑memset的唯一原因就是性能。你如何衡量性能差异? gcc有一个优化,可以识别类似memset的循环,并用memset调用替换它们。 – 2013-04-08 11:52:46

+0

@Marc,在我的功能,我不小心把memset和填充。其实在性能上没有任何可见的差异。我的代码通过tcp流读取每个数据包。我通过发送大文件和测量时间来了解性能的基本概念。 – woodstok 2013-04-08 12:30:32

回答

4

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

是。 23.3.6.1/1。在C++ 03标准有在23.2.4/1

等于串的 向量的元素相邻地存储,这意味着如果v是向量,其中T是某种类型的其他 比布尔,然后它服从身份& v [n]的== & v [0] + n,用于所有0 < = N < v.size()

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

编号矢量应始终保持连续。

但是,在gcc 4.6.3中,只有一个优化使用memset进行填充。此优化适用于字符类型

// 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); 
    } 
+0

我在哪里可以找到验证这一点的任何文档? – woodstok 2013-04-08 09:49:48

+0

即使我觉得你是对的,你仍然可以提供一些来源吗? – lucasg 2013-04-08 09:50:00

+0

感谢您提供款号,但您从哪里取得这些信息?你能提供一个链接吗? – woodstok 2013-04-08 09:54:14

1

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

只要记住,如果你的向量的内容不是一个普通的数据类型,你不应该做这种事情。

+0

是的,这是真的。它必须是POD。 – woodstok 2013-04-08 09:51:59

1

memset失败与向量的布尔类型,只是尝试下面的例子,虽然正如其他提到它适用于其他普通数据类型。我分享它只是为了明确它不是真的所有普通数据类型。

#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; 
} 
相关问题