我一直在研究的项目涉及移植一些旧代码。现在我们正在使用VS2010,但该项目设置为使用VS2008编译器和工具链,但最终我们可能会一直移动到VS2010工具链。有问题的结构如下所示:
struct HuffmanDecodeNode
{
union
{
TCHAR cSymbol;
struct
{
WORD nOneIndex;
WORD nZeroIndex;
} cChildren;
} uNodeData;
BYTE bLeaf;
}
由于我不打算进入的原因,sizeof(HuffmanDecodeNode)
需要为8.我假设在较旧的编译器上这是正确的,但现在我看到大小为6,除非我抛出一些填充字节。 #pragma pack(show)
确认数据应该是4字节对齐的,我认为这已经足够了,但似乎较新的编译器仅使用它进行对齐,并且不在结构的末尾插入任何尾部填充。 / p>
有没有办法可以控制尾随填充而不用只添加更多的struct成员?
答案 0 :(得分:2)
您可以将__declspec( align(8) )
放在结构声明前面。
http://msdn.microsoft.com/en-us/library/83ythb65%28v=vs.100%29.aspx
但是...
WCHAR的大小为2字节,WORD也是如此。它们都需要对齐到2个字节。 BYTE的大小为1字节,没有对齐要求。
我认为你的结构中不需要4字节对齐。
http://msdn.microsoft.com/en-us/library/aa383751%28v=vs.85%29.aspx
P.S。在GCC中,您可以使用__attribute__ ((aligned (8))