sizeof возвращает разные значения для структуры при компиляции разных программ - PullRequest
3 голосов
/ 05 ноября 2010

У меня есть 2 программы, которые совместно используют файл заголовка. Этот заголовочный файл определяет структуру с несколькими членами. Затем существует #define: #define STRUCTURE_SIZE sizeof(OUR_STRUCTURE).

Эта структура затем используется в разделяемой памяти, а STRUCTURE_SIZE используется для аргумента size для shmget().

К сожалению, для одной программы STRUCTURE_SIZE заканчивается 20758, а для другой - 20764. Поэтому, когда вторая программа пытается получить общую память, shmget() возвращает EINVAL.

uname -a:

Linux machine 2.6.30.10-105.2.23.fc11.i686.PAE #1 SMP Thu Feb 11 07:05:37 UTC 2010 i686 i686 i386 GNU/Linux

g++ --version

g++ (GCC) 4.4.1 20090725 (Red Hat 4.4.1-2)

Ответы [ 4 ]

13 голосов
/ 05 ноября 2010

Несколько возможностей:

  • вы компилируете две программы с разными компиляторами и / или переключателями компилятора
  • у вас есть другой заголовок, который появляется перед рассматриваемым заголовком в одной из программ, и он путается с #pragma pack или аналогичным и не восстанавливает настройку
  • тип, который используется в разделяемой структуре, определяется по-разному в двух программах

(Примечание: последние две точки могут быть применены рекурсивно к любым другим структурам, которые используются в структуре задачи.)

2 голосов
/ 05 ноября 2010

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

struct OUR_STRUCTURE
{
  double d;
  other_structure other;
  bool flag;
};

OUR_STRUCTURE ours;
cout << &ours.d - &ours << endl;
cout << &ours.other - &ours << endl;
cout << &ours.flag - &ours << endl;
cout << &ours + sizeof(OUR_STRUCTURE) - &ours.flag << endl;
2 голосов
/ 05 ноября 2010

Другие возможности:

  • Набор определений, используемых в двух компиляциях, отличается, и структура определяется условно на этих определениях
  • Некоторые типы могут иметь разные размеры в ядре ипространство пользователя (это редко, но может случиться)
2 голосов
/ 05 ноября 2010

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

...