繁体   English   中英

模板专业化结构大小

[英]Template specialization struct size

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的大小Pixel3D为14个字节。 对于unsigned charfloat ,使用的数据类型的大小分别为1和4。

附加字节在哪里,如何获得与所包含数据大小匹配的结构大小?

环境是VS 9.0,Windows7 x64,编译为32Bit,调试和发布模式。

我没有解决方案,但至少部分原因是额外字节的类型不能为0; 即使是空的结构或类(例如Alpha_data<false> )也将具有至少一个大小。 另一方面,您从它们派生的,因此应该应用空的基类优化(该优化使基类的有效大小为0,即使sizeof报告更多)也是如此。 显然,MSC仅将其应用于一个基础,可能是第一个。 否则,您的大小将为15。

可能对您没有太大帮助,但是g ++的大小为12和13,这对应于将空基类优化应用于所有基类。

除非有人知道让MSC在应用空基类优化方面更具攻击性的选项,否则您的选择就是将其作为错误报告给Microsoft,希望它们会是全面的(因为该标准不需要空基类优化)完全使用类优化),或切换到g ++。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM