模板特化结构大小

时间:2014-10-10 08:35:45

标签: c++ templates

在将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 charfloat的1和4。

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

环境是VS 9.0,Windows7 x64,编译为32位,Debug&amp;发布模式。

1 个答案:

答案 0 :(得分:1)

我没有解决方案,但至少部分原因是 额外字节是一个类型的大小不能为0;甚至一个 空结构或类(例如像Alpha_data<false>)将有 大小至少为一。另一方面, 派生 从他们,所以空基类优化(允许 即使sizeof有效大小为0的基类 报告更多)应该适用。显然,MSC只是申请 它可能是第一个基地之一。否则,你就是 得到15的大小。

可能对你没什么帮助,但是g ++给出了12和13的大小, 这对应于应用空基类优化 所有的基地。

除非有人知道使MSC更具侵略性的选项 在应用空基类优化时,您的选项是 将此报告为微软的一个错误,希望他们能够 全面的(因为标准并不要求空 可以使用基类优化),或切换到g ++。