【问题标题】:Control trailing struct padding in VS 2008/2010? (#pragma pack is not good enough)控制 VS 2008/2010 中的尾随结构填充? (#pragma pack 不够好)
【发布时间】:2012-03-15 09:44:50
【问题描述】:

我一直从事的项目涉及移植一些旧代码。现在我们正在使用 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 字节对齐的,我认为这已经足够了,但似乎较新的编译器仅使用它进行对齐,并且不会在结构的末尾插入任何尾随填充。

有没有什么方法可以控制尾随填充而无需只添加更多的结构成员?

【问题讨论】:

  • 那是一个非常奇怪的编译器,不出所料,它不再使用了。与您现在拥有的那个作斗争毫无意义,#pragma pack 无法完成工作。只需添加两个虚拟字节或一个单词即可完成。

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


【解决方案1】:

你可以把__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)) 执行相同操作

【讨论】:

  • 结构需要与脚本语言中定义的结构的大小相匹配,所以是的,它必须是那个大小。 __declspec( align(4) ) 似乎可以解决问题!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 2017-03-09
  • 1970-01-01
  • 2014-04-23
相关资源
最近更新 更多