[英]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.