Согласно Марк Рэнсомс ответ при использовании memset, я использую memset на vector<int>
назначить значения всем элементам.
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, то он подчиняется идентичности &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);
}
Это должно быть безопасно с точки зрения памяти.
Просто имейте в виду, что если содержимое вашего вектора не является простым типом данных, вы не должны делать такого рода вещи.
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;
}