我一直在从事的项目涉及移植一些旧代码。现在我们使用的是 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 字节对齐的,我认为这已经足够了,但似乎较新的编译器仅使用它进行对齐,并且不插入任何尾随填充在结构的末尾。
有什么方法可以控制尾随填充而无需仅添加更多结构成员?
最佳答案
您可以将 __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
附注在 GCC 中,您可以使用 __attribute__ ((aligned (8))
关于c++ - 控制 VS 2008/2010 中的尾随结构填充? (#pragma pack 还不够好),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9439271/