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++ - CMake目标仅编译源文件

visual-studio - 理解T4有困难

visual-studio-2010 - Visual Studio 包构建和私有(private) bin 路径中的 DLL

asp.net-mvc - 为什么我不能从 Web 平台安装程序安装 ASPNET MVC2? (错误 : "requires VS2008 SP1", 但已安装 SP1!)

c++ - 控制台输出某个值 - 如果在它之后直接声明不使用相同的值

c++ - 高效布局和减少虚拟2D数据(抽象)

visual-studio-2008 - 使用快捷键在Visual Studio 2008中打开任何资源

.net - 无法设置 ComboBox 的 DropDownHeight

c++ - VS2012 C++ 到 XCode

silverlight - 为什么我在 System.Diagnostics silverlight 项目 VS 2010 中找不到进程类