模板专业化结构大小

Posted

技术标签:

【中文标题】模板专业化结构大小【英文标题】:Template specialization struct size 【发布时间】:2014-10-10 08:35:44 【问题描述】:

在将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,编译为32Bit,Debug & Release模式。

【问题讨论】:

你确定 VS9 将#pragma push 考虑到模板中吗? @filmor 我认为模板与此无关。如果没有#pragma pack,大小是 16,而不是 14(因为编译器必须保证大小是 4 的倍数)。 【参考方案1】:

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

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

除非有人知道让 MSC 更具侵略性的选项 在应用空基类优化时,您的选择是 将此作为错误报告给 Microsoft,希望他们会 全面的(因为标准不要求空 完全使用基类优化),或切换到 g++。

【讨论】:

有道理,谢谢。似乎这个“错误”已经存在了一段时间(例如***.com/questions/12701469/…、***.com/questions/6119927/…),所以可能没有用向 MS 报告它。我相信我们会找到另一个(可能是非模板)解决方案。 @Matz 您可以将模板保留在用户级别。 (客户端代码编写typedef Pixel&lt;true,false,false,false&gt; Pixel3D; 可能比为类使用不同的名称更方便。)只是不提供默认实现,而是为每个可能的实例提供专门化(从某种脚本生成) .

以上是关于模板专业化结构大小的主要内容,如果未能解决你的问题,请参考以下文章

模板变量 C 数组完全专业化是不是应该指定数组大小?

gcc 的 C++ 部分模板专业化问题

国内最专业的网站模板网站,哪个好用?

非专业模板中模板专业化的成员访问

C ++模板专业化优先级。模板化专业化

c ++模板专业化和模板参数的数量