Что означает предупреждение «выравнивание элемента было чувствительным к упаковке» в C ++ - PullRequest
12 голосов
/ 08 октября 2010

Что означает предупреждение «выравнивание элемента было чувствительным к упаковке» в C ++?Я использую Visual Studio 2005.

Как мне удалить эти предупреждения?Кстати, я не хочу их отключать.

Ответы [ 2 ]

13 голосов
/ 08 октября 2010

Некоторые типы данных должны быть выровнены по определенной границе.Так, например:

struct V
{
  char a;
  double b;
  char c;
  double d;
};

sizeof (char) равен 1, а sizeof (double) равен 8, но размер этой структуры может быть больше ожидаемого 18, если ему нужно, чтобы удваивались для выравнивания с 8-граница байта.В этом случае и поскольку члены должны появляться в памяти в порядке, в котором они объявлены в структуре, может быть 7 байт «заполнения» рядом с членом c, и, возможно, некоторые с элементом a тоже.

Опасность здесь возникает, когда упаковка нестандартна, поэтому размер этой структуры может варьироваться, и вы отправляете ее в «двоичном» формате по проводам или сохраняете в файле, где она будет читаться в другом месте (даже если endian-единство двойников одинаково).

В качестве альтернативы предложениям по удалению предупреждения с помощью прагм, вы можете решить разобраться с ним в коде, изменив порядок своих членов.Поместите те, которые нуждаются в наибольшем выравнивании сначала, а более низкие позже.Поэтому сначала ставьте указатели и двойники, затем целые, затем шорты и любые символы-члены последними.

11 голосов
/ 08 октября 2010

Взято из MSDN -

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

Элемент структуры выравнивается по смещению памяти, значение которого не равнократный размеру члена.Например, следующий фрагмент кода выдаст это предупреждение:

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

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

  • Изменить pack(2) на pack(4).
  • Обратный порядок элементов структуры так, что int предшествует char.

Когда данные не выровнены по границам, кратным размеру данных.производительность может ухудшиться, и если вы перенесете свой код на RISC-компьютер, он не скомпилируется.

Вы можете указать выравнивание структуры с помощью #pragma pack или / Zp.Обратите внимание, что компилятор не генерирует это предупреждение, если указан / Zp1.

...