C++ 模板专门化结构大小
将C++ 模板专门化结构大小,c++,templates,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>
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)
#pragma包(推送,1)
模板
结构RGB_数据{
typedef无符号字符typeRGB;
RGB-R型;
rgbg型;
RGB型;
};
模板结构RGB_数据{};
模板
结构XYZ_数据{
typedef float type3D;
3d-X型;
3d-Y型;
3d-Z型;
};
模板结构XYZ_数据{};
模板
结构Alpha_数据{
typedef无符号字符typeAlpha;
A型;
};
模板结构Alpha_数据{};
模板
结构置信度数据{
typedef无符号字符typeConfidence;
C型置信度;
};
模板结构置信度_数据{};
模板<
bool enableXYZ,
布尔使能RGB,
bool enableC,
布尔埃纳布利亚
>
结构像素:
公共XYZ_数据,
公共RGB_数据,
公共Alpha_数据,
公众信心数据
{};
typedef像素Pixel3D;
typedef像素Pixel3Dc;
#布拉格语包(流行语)
然而,Pixel3Dc
struct的大小是14字节;Pixel3D
的大小也是14字节。对于无符号字符
和浮点
,正在使用的数据类型的大小分别为1和4
附加字节在哪里?如何实现与所包含数据大小匹配的结构大小
环境是VS9.0,Windows7 x64,编译为32位,调试和发布模式。我没有解决方案,但至少部分原因是 额外字节是指类型的大小不能为0;甚至 空结构或类(如
Alpha_data
)将具有
至少一号的尺寸。另一方面,你是在推导
因此,空基类优化(允许
基类的有效大小为0,即使sizeof
报告(更多)应适用。显然,MSC只是在申请
它被转移到一个基地,可能是第一个基地。否则,你会
买15码的
可能对您帮助不大,但g++提供12和13的大小,
对应于应用空基类优化
所有的基地
除非有人知道让MSC更具侵略性的选择
在应用空基类优化时,您的选项是
将此作为错误报告给Microsoft,希望他们
全面(因为标准不要求
可以使用基类优化),也可以切换到g++ 你确定VS9对模板考虑了
#pragma push
吗?@filmor我认为模板与此无关。如果没有#pragma pack
,则大小是16,而不是14(因为编译器必须保证大小是4的倍数)。这很有意义,谢谢。这个“错误”似乎已经存在了一段时间(例如),所以向MS报告可能没有用。我相信我们会找到另一个(可能是非模板)解决方案。@Matz您可以将模板保留在用户级别。(客户端代码编写typedef Pixel Pixel3D;
可能比为类使用不同的名称更方便。)只是不提供默认实现,而是为每个可能的实例化(从某种脚本生成)提供专门化。