控制VS 2008/2010中的尾随结构填充? (#pragma pack不够好)

时间:2012-02-24 23:02:01

标签: c++ visual-studio-2010 visual-studio-2008 visual-c++ memory-alignment

我一直在研究的项目涉及移植一些旧代码。现在我们正在使用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成员?

1 个答案:

答案 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))

执行相同的操作