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

发布于 2025-01-08 20:55:05 字数 581 浏览 0 评论 0原文

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

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

The project that I've been working on involves porting some old code. Right now we are using VS2010 but the project is setup to use the VS2008 compiler and tool chain but eventually we will probably move all the way to the VS2010 toolchain. The struct in question looks like this:

struct HuffmanDecodeNode
{
    union
    {
        TCHAR cSymbol;
        struct
        {
            WORD nOneIndex;
            WORD nZeroIndex;
        } cChildren;
    } uNodeData;
    BYTE bLeaf;
}

For reasons that I won't go into, sizeof(HuffmanDecodeNode) needs to be 8. I'm assuming that on the older compilers this worked out correctly, but now I'm seeing that the size is 6 unless I throw in some padding bytes. #pragma pack(show) confirms that the data should be 4 byte aligned which I assume used to be sufficient, but it appears that the newer compiler only uses this for alignment and doesn't insert any trailing padding at the end of the struct.

Is there any way that I can control the trailing padding without just adding more struct members?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

草莓酥 2025-01-15 20:55:05

您可以将 __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


PS 在 GCC 中,您可以使用 __attribute__ 执行相同操作((对齐 (8))

You can put __declspec( align(8) ) in front of your struct declaration.

http://msdn.microsoft.com/en-us/library/83ythb65%28v=vs.100%29.aspx

but...

WCHAR has size 2 bytes, same for WORD. They both need alignment to 2 bytes only.
BYTE has size 1 byte and no alignment requirement.

I don't think you need the 4 byte alignment in your struct.

http://msdn.microsoft.com/en-us/library/aa383751%28v=vs.85%29.aspx


P.S. In GCC you can do the same with __attribute__ ((aligned (8))

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文