Управление дополнением трейлинг-структуры в VS 2008/2010?(#pragma pack недостаточно хорош) - PullRequest
2 голосов
/ 25 февраля 2012

Проект, над которым я работал, включает перенос старого кода.Сейчас мы используем 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 байта, что, как я полагаю, было достаточным, но похоже, что более новый компилятор использует это только для выравнивания и не вставляет завершающие отступы в конце структуры.

Есть ли способ, которым я могу управлять конечным заполнением без , просто добавляя больше элементов структуры?

1 Ответ

2 голосов
/ 25 февраля 2012

Вы можете поставить __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__ ((aligned (8))

...