Могут ли два процесса с одинаковыми параметрами времени компиляции иметь разные байтовые выравнивания на одном компьютере?

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

Это возможно? Если да, то какое решение иметь одинаковое выравнивание в обоих?

например. Одна из структур

typedef struct a {
                   unsigned int x;
                   unsigned long long y;
                 }b;

В процессе 1 размер вышеуказанной структуры равен 12, тогда как в процессе 2 размер равен 16. Размер int равен 4 байта, а длина без знака long составляет 8 байтов в машине.

В GDB данные, хранящиеся в разделяемой памяти, начиная с экземпляра вышеуказанной структуры, выглядят так:

0x01 0x02 0x03 0x04 0x00 0x00 0x00 0x00  
0x00 0x00 0x00 0x00 0x05 0x06 0x07 0x08  

В процессе 1: b.x = 0x1020304 а также b.y = 0x0
В процессе 2: b.x = 0x1020304 а также b.y = 0x5060708

1 ответ

Чтобы выровнять структуру, взгляните на атрибут align (специфичный для GCC). Что касается вашего вопроса, я не знаю никакой причины, по которой компилятор выравнивает структуры по-разному. Вы должны предоставить более подробную информацию, чтобы расследовать это...

Другие вопросы по тегам