Поделиться через


Предупреждение компилятора (уровень 4) C4121

"символ" : выравнивание члена чувствительно к упаковке

Компилятор добавил заполнение для выравнивания члена структуры по границе упаковки, но упаковочный размер меньше размера члена. Например, следующий фрагмент код приводит к появлению предупреждения C4121:

// C4121.cpp
// compile with: /W4 /c
#pragma pack(2)
struct s
{
   char a;
   int b; // C4121
   long long c;
};

Чтобы устранить эту проблему, внесите одно из следующих изменений.

  • Задайте для упаковочного размера значение, большее или равное размеру члена, который вызвал предупреждение. Например, в этом фрагменте кода измените pack(2) на pack(4) или pack(8).

  • Измените порядок объявления членов в соответствии с их размером, в порядке убывания. В этом фрагменте кода расположите члены структуры так, чтобы член long long предшествовал члену int, а член int предшествовал члену char.

Это предупреждение возникает только в случае, когда компилятор добавляет заполнение перед членами данных. Оно не возникает, если при упаковке данные были помещены в расположение в памяти, не выровненное для этого типа данных, но при этом заполнение перед членом данных не добавлялось. Если данные не выровнены по границе, кратной размеру данных, возможно снижение производительности. При чтении и записи невыровненных данных на процессорах с некоторым архитектурами возникают ошибки, на устранение которых может потребоваться на 2–3 порядка больше времени. Доступ к невыровненным данным невозможно перенести на некоторые архитектуры RISC.

Вы можете использовать пакет #pragma или /Zp для указания выравнивания структуры. (Компилятор не создает это предупреждение при указании /Zp1 .)