2013-04-08 94 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; 
} 
相關問題