Я испытываю, по крайней мере, для меня странное поведение при применении оператора sizeof
к специализации шаблона. Рассмотрим эти объявления:Шаблон специализации struct size
#pragma pack(push, 1)
template <bool enable>
struct RGB_data {
typedef unsigned char typeRGB;
typeRGB R;
typeRGB G;
typeRGB B;
};
template <> struct RGB_data<false> {};
template <bool enable>
struct XYZ_data {
typedef float type3D;
type3D X;
type3D Y;
type3D Z;
};
template<> struct XYZ_data<false> {};
template <bool enable>
struct Alpha_data {
typedef unsigned char typeAlpha;
typeAlpha A;
};
template<> struct Alpha_data<false> {};
template <bool enable>
struct Confidence_data {
typedef unsigned char typeConfidence;
typeConfidence C;
};
template<> struct Confidence_data<false> {};
template <
bool enableXYZ,
bool enableRGB,
bool enableC,
bool enableA
>
struct Pixel :
public XYZ_data<enableXYZ>,
public RGB_data<enableRGB>,
public Alpha_data<enableA>,
public Confidence_data<enableC>
{};
typedef Pixel<true,false,false,false> Pixel3D;
typedef Pixel<true,false,true,false> Pixel3Dc;
#pragma pack(pop)
Однако размер Pixel3Dc
структуры составляет 14 байт; размер Pixel3D
также составляет 14 байтов. Размеры используемых типов данных 1 и 4 для unsigned char
и float
, соответственно.
Где дополнительные байты и как я могу получить размер структуры, соответствующий размеру содержащихся данных?
Окружающая среда - VS 9.0, Windows7 x64, Скомпилировано до 32Bit, Отладка & Режим деблокирования.
Вы уверены, что VS9 берет '#pragma push' для учета шаблонов? – filmor
@filmor Я не думаю, что шаблоны имеют к этому какое-то отношение. И без '#pragma pack' размер равен 16, а не 14 (поскольку компилятор должен гарантировать, что размер будет кратным 4). –