Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板专门化结构大小_C++_Templates - Fatal编程技术网

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;
可能比为类使用不同的名称更方便。)只是不提供默认实现,而是为每个可能的实例化(从某种脚本生成)提供专门化。