memset для вектора & lt; int & gt;

Согласно Марк Рэнсомс ответ при использовании 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 это может измениться и сломать мой код позже?

4

Решение

реализации 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);
}
4

Другие решения

Это должно быть безопасно с точки зрения памяти.

Просто имейте в виду, что если содержимое вашего вектора не является простым типом данных, вы не должны делать такого рода вещи.

1

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;
}
1
По вопросам рекламы [email protected]