在将 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 位,调试和 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/