Что отключает #pragma pack (push)? - PullRequest
2 голосов
/ 23 июня 2010

У меня есть код, который использует #pragma pack (push, 8), но, похоже, он не вступает в силу, но я не могу понять, что вызывает эту проблему.

Например, посмотрите на следующий код.

#include <windows.h>
#include <stdio.h>

#pragma pack(push, 8)

typedef struct _MY_DATA {
 LARGE_INTEGER a;
 LARGE_INTEGER b;
 ULONG count;
} MY_DATA;

#pragma pack(show)
#pragma pack(pop)

int main()
{
 MY_DATA data;

 printf("data size:%d\n", sizeof(data));

 return 0;
}

Это вернет "размер данных: 24", но я использую тот же код в другом приложении, управляемом Visual Studio, и там я получаю "размер данных: 20".

Так что я предполагаю, что это связано с некоторыми настройками, но не смог понять. Я буду очень признателен, если кто-нибудь может дать мне подсказку. Спасибо.

1 Ответ

2 голосов
/ 23 июня 2010

Настройка проекта по умолчанию может иметь более высокий приоритет, чем прагма - см. в этой статье MSDN .

Упаковка структуры взаимодействует с поведением выравнивания компилятора следующим образом.

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