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

标签 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 字节对齐的,我认为这已经足够了,但似乎较新的编译器仅使用它进行对齐,并且不插入任何尾随填充在结构的末尾。

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

最佳答案

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

相关文章:

c++ - 最大化 CPU 使用率

c++ - 以未捕获的类型异常终止

.net - 将 .NET 命名空间导入到空的 Visual C++ 项目

sql - 有没有办法在 Visual Studio 中将 SQL 脚本导入 MDF 数据库?

visual-studio-2008 - 如何更改Visual Studio 2008的注册公司名称?

c++ - 在容器中找到最大现值的算法

c++ - make_shared 是否有可能没有任何异常但返回 nullptr?

visual-studio-2010 - C# 和 C++ 项目之间的项目依赖关系,构建顺序

c# - 单击一次部署和解决方案配置

visual-studio-2008 - 如何获得Visual Studio 2008以支持Windows 9x?