выравнивание std :: array - PullRequest
9 голосов
/ 25 ноября 2011

При попытке std::tr1::array на Mac я получаю 16-байтовое выравнивание.

sizeof(int) = 4;  
sizeof( std::tr1::array< int,3 > ) = 16;  
sizeof( std::tr1::array< int,4 > ) = 16;    
sizeof( std::tr1::array< int,5 > ) = 32;

Есть ли что-то в STL, которое ведет себя как массив , но гарантированно НЕ дополняет себя, то есть

sizeof( ARRAY< T, N> ) = sizeof(  T )*N  

Ответы [ 4 ]

2 голосов
/ 26 ноября 2011

Стандарт гласит, что элементы "хранятся непрерывно, а это означает, что если a является массивом, то он подчиняется тождеству & a [n] == & a [0] + n для всех 0 <= n <N."(23.3.2.1 [array.overview] параграф 1) </p>

Насколько я знаю, нет гарантии, что sizeof (std :: array) == sizeof (T) * N, но утверждение смежности утверждаетчто значения хранятся так же, как в обычном C-массиве.Если у вас есть только один массив значений, которые должны быть смежными, вы можете использовать sizeof (T) * std :: array :: size () в качестве размера и std :: array :: data () в качестве начального адресамассив.

0 голосов
/ 23 мая 2013

std::array на самом деле не массив, а структура, содержащая массив. Это структура, которая дополняется, а не массив. Компиляторам разрешается добавлять отступы в конец структуры в любое время.

0 голосов
/ 26 ноября 2011

После публикации, я получаю то, что хочу, меняя настройку IDE со значения по умолчанию на ..

LLVM compiler 3.0 Language:
  LLVM C++ standard library:
    =libc++ (LLVM standard library with c++0x support.)

(CLANG_CXX_LIBRARY = libc ++) l

Ранее настройка была "libstdc ++ (стандартная библиотека gcc c ++)", которая, как представляется, имеет отступы, и это позволило мне включить <array> вместо <tr1/array>; а теперь

sizeof(array<T,N>)==sizeof(T)*N

это все в Xcode 4.2 на Mac OSX LION. Я надеюсь, что кто-то просто устарел, и что такое поведение я получу на других платформах?

0 голосов
/ 25 ноября 2011

Из того небольшого количества данных, которое вы дали, похоже, что он выделяет память с точностью до ближайшей степени двух.Зная очень мало деталей архитектуры ЦП, я мог бы догадаться, что распределение размеров двух степеней быстрее, чем без дополнения, по крайней мере, для небольших объемов.Возможно, вам стоит посмотреть, что произойдет, когда вы попытаетесь выделить что-то гораздо большее?

Есть ли какая-то причина, по которой вам абсолютно положительно нужно убрать эти лишние байты сверху?

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