Является ли память в std :: array непрерывной? - PullRequest
16 голосов
/ 09 июля 2011

Память в std::array смежна? Является ли следующая действительная / хорошая практика?

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

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

Ответы [ 2 ]

29 голосов
/ 09 июля 2011

Да, он является смежным, поскольку в основном (и фактически) является 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. - конец примечания ]

0 голосов
/ 09 июля 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...