Является ли память в std:: array непрерывной?

Является ли память в std::array непрерывной? Является ли следующая действительная/эффективная практика?

std::array<type1,Num> arr = //initialize value
type1 * ptr = &arr[0];

Могу ли я передать ptr функции, ожидающие массив c-style?

Ответы

Ответ 1

Да, он смежный, поскольку он в основном (и фактически) a type arr[10];, но с интерфейсом STL. Он также не распадается на указатель на малейшую провокацию.

Вы можете безопасно передать &arr[0] функции, ожидающей массив C-стиля, что его цель дизайна. Однако, чтобы использовать его с алгоритмами STL, просто используйте функции begin и end:

// either members
std::sort(arr.begin(), arr.end());
// or free from <iterator>
std::sort(std::begin(arr), std::end(arr));

Для части юридического лица, §23.3.2.1 [array.overview] p1:

Заголовок <array> определяет шаблон класса для хранения последовательностей объектов фиксированного размера. Массив поддерживает итераторы с произвольным доступом. Экземпляр array<T, N> хранит N элементы типа T, так что size() == N является инвариантом. Элементы array сохраняются смежно, что означает, что если a является array<T, N>, тогда он подчиняется идентификатору &a[n] == &a[0] + n для всех 0 <= n < N.

И §23.3.2.1 [array.overview] p2:

Массив - это агрегат (8.5.1), который может быть инициализирован синтаксисом

  • array<T, N> a = { список инициализаторов };

Кроме того, в p3, перечисляя члены std::array:

T elems[N]; // exposition only
[Примечание: переменная-член elems показана только для изложения, чтобы подчеркнуть, что array - это совокупность классов. Имя elems не входит в интерфейс array s. -end note]

Ответ 2

Да память std::array является смежной. На VC10 он объявлен как:

template<class _Ty,
    size_t _Size>
    class array
    { // fixed size array of values
                ... 
         _Ty _Elems[_Size == 0 ? 1 : _Size];
    };

Где _Elemes - не что иное, как простой массив заданного типа.