LINUX.ORG.RU

История изменений

Исправление shdown, (текущая версия) :

Всё равно не понимаю, как это связано с выравниванием, хоть убей.

Хорошо, давай попробуем сократовский диалог и наскальные рисунки.

char buf[128] = {0};
int *a = (int *) buf;
int *b = (int *) (buf + 1);

[ 0    0    0    0    0    0    ... ]
  ^^^^^^^^^^^^^^^^    ↑
  a    ↑              ↑
       ^^^^^^^^^^^^^^^^
       b

Мы присваиваем *a=1:

[ 1    0    0    0    0    0    ... ]
  ^^^^^^^^^^^^^^^^    ↑
  a    ↑              ↑
       ^^^^^^^^^^^^^^^^
       b

Мы присваиваем *b=1:

[ 1    1    0    0    0    0    ... ]
  ^^^^^^^^^^^^^^^^    ↑
  a    ↑              ↑
       ^^^^^^^^^^^^^^^^
       b

Мы читаем *a:

[ 1    1    0    0    0    0    ... ]
  ^^^^^^^^^^^^^^^^     
  a
*a должно быть 1 * 256 + 1 = 257. Но оно 1. Почему так?

Какую именно оптимизацию, по-твоему, убирает твой volatile?

Исходная версия shdown, :

Всё равно не понимаю, как это связано с выравниванием, хоть убей.

Хорошо, давай попробуем сократовский диалог и наскальные рисунки.

char buf[128] = {0};
int *a = (int *) buf;
int *b = (int *) (buf + 1);

[ 0    0    0    0    0    0    ... ]
  ^^^^^^^^^^^^^^^^    ↑
  a    ↑              ↑
       ^^^^^^^^^^^^^^^^
       b

Мы присваиваем *a=1:

[ 1    0    0    0    0    0    ... ]
  ^^^^^^^^^^^^^^^^    ↑
  a    ↑              ↑
       ^^^^^^^^^^^^^^^^
       b

Мы присваиваем *b=1:

[ 1    1    0    0    0    0    ... ]
  ^^^^^^^^^^^^^^^^    ↑
  a    ↑              ↑
       ^^^^^^^^^^^^^^^^
       b

Мы читаем *a:

[ 1    1    0    0    0    0    ... ]
  ^^^^^^^^^^^^^^^^     
  a
*a должно быть 1 * 256 + 1 = 257. Но оно 1. Почему так?