在将sizeof
运算符应用于模板特化时,我遇到了 - 至少对我来说 - 奇怪的行为。
请考虑以下声明:
#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个字节。正在使用的数据类型的大小分别为unsigned char
和float
的1和4。
附加字节在哪里,如何实现与包含数据大小匹配的结构大小?
环境是VS 9.0,Windows7 x64,编译为32位,Debug&amp;发布模式。
答案 0 :(得分:1)
我没有解决方案,但至少部分原因是
额外字节是一个类型的大小不能为0;甚至一个
空结构或类(例如像Alpha_data<false>
)将有
大小至少为一。另一方面, 派生
从他们,所以空基类优化(允许
即使sizeof
有效大小为0的基类
报告更多)应该适用。显然,MSC只是申请
它可能是第一个基地之一。否则,你就是
得到15的大小。
可能对你没什么帮助,但是g ++给出了12和13的大小, 这对应于应用空基类优化 所有的基地。
除非有人知道使MSC更具侵略性的选项 在应用空基类优化时,您的选项是 将此报告为微软的一个错误,希望他们能够 全面的(因为标准并不要求空 可以使用基类优化),或切换到g ++。