模板专业化结构大小
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 char
和 float
使用的数据类型的大小分别为 1 和 4。
额外的字节在哪里,如何获得与包含的数据大小相匹配的结构大小?
环境为VS 9.0,Windows7 x64,编译为32Bit,Debug & Release模式。
【问题讨论】:
你确定 VS9 将#pragma push
考虑到模板中吗?
@filmor 我认为模板与此无关。如果没有#pragma pack
,大小是 16,而不是 14(因为编译器必须保证大小是 4 的倍数)。
【参考方案1】:
我没有解决方案,但至少有部分原因
额外的字节是一个类型的大小不能为 0;甚至一个
空结构或类(例如Alpha_data<false>
)将具有
大小至少为 1。另一方面,您正在导出
从他们那里,所以空基类优化(它允许
有效大小为 0 的基类,即使 sizeof
报告更多)应该适用。显然,MSC只是申请
它到一个基地,可能是第一个。否则,你会
获得 15 的大小。
可能对你没有多大帮助,但 g++ 给出了 12 和 13 的大小, 这对应于应用空基类优化 到所有基地。
除非有人知道让 MSC 更具侵略性的选项 在应用空基类优化时,您的选择是 将此作为错误报告给 Microsoft,希望他们会 全面的(因为标准不要求空 完全使用基类优化),或切换到 g++。
【讨论】:
有道理,谢谢。似乎这个“错误”已经存在了一段时间(例如***.com/questions/12701469/…、***.com/questions/6119927/…),所以可能没有用向 MS 报告它。我相信我们会找到另一个(可能是非模板)解决方案。 @Matz 您可以将模板保留在用户级别。 (客户端代码编写typedef Pixel<true,false,false,false> Pixel3D;
可能比为类使用不同的名称更方便。)只是不提供默认实现,而是为每个可能的实例提供专门化(从某种脚本生成) .以上是关于模板专业化结构大小的主要内容,如果未能解决你的问题,请参考以下文章