Предупреждение компилятора (уровень 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 .)