Различия в размерах структур между Solaris Sparc и Solaris x86 - PullRequest
2 голосов
/ 22 февраля 2010

Я портирую наше приложение с Solaris Sparc на Solaris x86 и столкнулся с разницей в размерах структур между этими двумя архитектурами. например; У меня есть структура, как

typedef struct mystructS
{
  double a;
  double b;
  double c;
  double d;
  double e;
  double f;
  double g;
  double h;
  double aa;
  double ab;
  double ac;
  double ad;
  double ae;
  double af
  double ag;
  double ah;
  int ba;
  int bb;
  int bc;
  char ca[256];
} mystructT;

Когда я пишу sizeof(mystructT) в Solaris X86, он возвращает 396

Когда я пишу sizeof(mystructT) в солярис SPARC, он возвращает 400

Мне просто любопытно, почему что-то подобное происходит?

РЕДАКТИРОВАТЬ: обе системы Solaris являются 32-разрядными.

Ответы [ 4 ]

4 голосов
/ 22 февраля 2010

По какой-то причине (возможно, парные числа должны быть выровнены в sparc, а не в x86?), Похоже, он пытается убедиться, что следующая структура выровнена по 64-битной границе.

То есть для того, чтобы вы перепрыгнули шаги sizeof (mystructT) в памяти и все равно в конечном итоге указали на начало вашей структуры (например, при создании массива структур это то, что вы будете делать, когда перебор), структура должна быть дополнена в конце.

2 голосов
/ 22 февраля 2010

Если SPARC является 64-битным, компилятор может попытаться выровнять ca на границе, что означает добавление дополнительных 4 байтов между bc и ca. Если это так, вы, вероятно, можете попросить компилятор упаковать структуру, чтобы она не добавляла байты заполнения, но то, как вы говорите, делает это немного зависимым от компилятора.

0 голосов
/ 22 февраля 2010

Скорее всего, alignof(double) - это 8 с одним компилятором и 4 с другим.

Выравнивание структуры компилируется как наименьшее общее кратное выравнивания ее полей, и в данном конкретном случае это означает, что значение double определяет выравнивание struct mystructS.

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

0 голосов
/ 22 февраля 2010

Поскольку заполнение и выравнивание членов структуры всегда определяется реализацией, вы никогда не должны делать никаких предположений относительно размера структуры (даже между разными версиями одного и того же компилятора на одной платформе или одного и того же компилятора с разными настройками оптимизации).

Если вам нужно конкретное выравнивание и упаковка, вы должны использовать специальные директивы компилятора для достижения этой цели. Это может быть опция компиляции из командной строки, директива #pragma или GCC и некоторые другие спецификации компиляторов __attribute__. Или, возможно, более надежно (но больше работы) использовать сериализацию данных.

...