簡體   English   中英

媒介集<int>

[英]memset on vector<int>

根據Mark Ransoms關於使用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庫實現中,是否可能會更改並在以后破壞我的代碼?

將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);
    }

從內存的角度來看,這應該是安全的。

請記住,如果向量的內容不是純數據類型,則不應執行此類操作。

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM