В C++ 11 std::array
определяется как непрерывное хранилище и производительность, которая не хуже массива, но я не могу решить, подразумевают ли различные требования стандарта что std :: array имеет тот же размер и макет памяти, что и обычный массив. То есть вы можете рассчитывать на sizeof(std::array<int,N>) == sizeof(int)*N
или это конкретная реализация?Является ли размер std :: array определенным стандартом
В частности, это гарантированно работать так, как можно было бы ожидать его:
std::vector< std::array<int, N> > x(M);
typedef (*ArrayPointer)[N];
ArrayPointer y = (ArrayPointer) &x[0][0];
// use y like normal multidimensional array
Он работает в двух составителей я попробовал (GNU & Intel). Кроме того, вся документация сторонней стороны, которую я мог найти (like this), утверждает, что std :: array эффективен как память как простой массив, который в сочетании с непрерывным требованием подразумевал бы, что он должен иметь идентичный макет памяти. Однако я не могу найти это требование в стандарте.
В '23.3.2 массив шаблонов нет такой гарантии, и действительно, поиск стандарта для' sizeof', кажется, только для меня включает следующие гарантии: 'char' и его варианты -' 1', и 'nullptr' имеет тот же размер, что и' void * '. – us2012
Как говорится в @ us2012, нет явной гарантии. Хотя он может работать на вашей платформе выбора, он может выйти на другие платформы с различными ограничениями выравнивания. –