c++ - 模板特化结构大小

标签 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 位,调试和 Release模式。

最佳答案

我没有解决办法,但至少是部分原因 extra bytes 是类型的大小不能为 0;甚至一个 空结构或类(例如 Alpha_data<false> )将有 至少一个大小。另一方面,您正在推导 从他们那里,所以空基类优化(允许 一个有效大小为 0 的基类,即使 sizeof 报告更多)应该适用。显然,MSC只是在申请 它到一个基地,可能是第一个。否则,你会 尺寸为 15。

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

除非有人知道可以让 MSC 变得更积极 在应用空基类优化时,您的选择是 将此作为错误报告给 Microsoft,希望他们会 全面(因为标准不要求空的 根本不使用基类优化),或者切换到 g++。

关于c++ - 模板特化结构大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26295168/

相关文章:

python - Django – 在模板标签中使用模板标签?

c++ - 我怎样才能索引一个集合并允许每个索引的变量有一个自定义的 setter ?

c++ - 我们是否需要在嵌套类型的成员参数前加上 "::"前缀?

c++ - 计算具有三个不同质因数的数

c++ - Linux串口通信异常?

c++ - 如何基于作为 STL 容器的模板参数模拟选定成员函数的部分特化?

c++ - 模板类方法声明失败

C++ 模板参数和偏特化 : strong or weak typing?

c++ - 为什么我不能在类中另一个函数的声明中使用静态 constexpr 的结果?

c++ - "Ill-defined for-loop - loop executes infinitely"(MSVC C6295)