
Сообщение от
Avazart
Какова тут роль volatile ?
C
const /* volatile */ int *port;
int func (void)
{
int a, b;
a = *port;
b = *port;
return a * b;
}
Без volatile компилятор соптимизировал два обращения в один и тот же участок памяти и заменил их на одно обращение. Т.е. вместо "b = *port" по сути дела построил код "b = a":
Bash
$ gcc t.c -O2 -S
$ cat t.s
...
movl port, %eax
pushl %ebp
movl %esp, %ebp
popl %ebp
movl (%eax), %eax <--- прочитали *port
imull %eax, %eax <--- перемножили два одинаковых значения (соптимизировали)
...
теперь раскомментируем volatile и увидим, что больше эти два обращения в один и тот же участок памяти не оптимизируются:
Bash
$ gcc t.c -O2 -S
$ cat t.s
...
movl port, %edx
pushl %ebp
movl %esp, %ebp
popl %ebp
movl (%edx), %eax <--- первый раз прочитали *port
movl (%edx), %edx <--- второй раз прочитали *port
imull %edx, %eax
...
В данном тесте модификатор const вообще никакой роли не играет. Он влияет только на то, что без const'а компилятор разрешит операцию "*port = 0", а с const'ом - нет
Добавлено через 6 минут
В общем старый мусор из этого поста грохнул и нормальный тест нарисовал
Добавлено через 6 минут
Ну и ещё две ссылки до кучи:
Инициализация статического массива
Пример использования спецификатора volatile