Данный:
template <int N>
struct val2size
{
char placeholder[N];
};
Есть ли гарантия, что sizeof(val2size<N>) == N
?
Данный:
template <int N>
struct val2size
{
char placeholder[N];
};
Есть ли гарантия, что sizeof(val2size<N>) == N
?
Единственная гарантия заключается в том, что
sizeof(val2size<N>) >= N
В конце структуры может быть безымянный отступ. Не думаю, что там будет безымянный отступ, но это возможно.
sizeof(int)
является естественным размером слова (хотя не уверен, что он определен таким образом), есть ли шанс для заполнения в случае, если это был массив int (с размером тогда N * sizeof(int)
)?
- person uj2; 06.09.2010
Нет, Джеймс покрывает это. Но вы можете получить то, что хотите:
template <std::size_t N> // not an int, a negative value doesn't make sense
struct value_to_size
{
typedef char type[N];
};
sizeof(value_to_size<N>::type)
гарантированно будет N
. (Этот трюк можно использовать для компиляции утилита -time size-of array.)
val2size
в качестве возвращаемого типа. Но чего вы пытаетесь достичь, приравнивая тип к определенному значению? Проверки времени компиляции?
- person dirkgently; 06.09.2010
По умолчанию нет гарантии из-за возможного заполнения. Однако многие компиляторы (по крайней мере, VC ++ и gcc) позволяют устанавливать выравнивание структур с помощью прагмы, например:
#pragma pack(push, 1)
template <int N>
struct val2size
{
char placeholder[N];
};
#pragma pack(pop)
Установка выравнивания на 1 по существу предотвращает любые дополнительные отступы в конце структуры.
Это зависит от размера N на самом деле и от того, может ли этот размер N char соответствовать мировому уровню. Если память символьного массива выровнена по миру (4 байта для 32-битного и 8-байтового для 64-битного), тогда вы получите sizeof == N, или, если нет, то он добавит отступ, чтобы выделить память для выравнивания по миру и в этом случае это будет> = N.
boost::array<char,N>
или C ++ 0xstd::array
. - person Potatoswatter   schedule 06.09.2010