Ключевое слово const
используется только во время компиляции.После того, как код скомпилирован, переменная является просто адресом в памяти, без какой-либо специальной защиты.
Однако есть некоторая разница - глобальные const
переменные будут помещены в text
сегмент, а не data
(если инициализирован) или bss (если не инициализирован).Если сегмент text
обрабатывается по-другому, например, выполняется на месте из флэш-памяти NOR (вместо ОЗУ), возможно, существует различие. Локальные const
переменные помещаются в стек вместе с обычными переменными, поэтому не должно быть никакой разницы.
Кроме этого, как сказал bestsss, некоторые оптимизации времени компиляции могут быть невозможныесли переменная является константой.Я не могу думать ни о чем (особенно не в чистом C), но теоретически это возможно.
Редактировать:
Следующий код продемонстрировал точку во втором абзаце:
const int g = 1;
int not_const = 1;
void foo(int param)
{
int i = 1;
const int j = 1;
printf("Variable: \t\t0x%08x\n", (int)&i);
printf("Const varialbe: \t0x%08x\n", (int)&j);
printf("Parameter: \t\t0x%08x\n", (int)¶m);
printf("Global const: \t\t0x%08x\n", (int)&g);
printf("Global non-const: \t0x%08x\n", (int)¬_const);
}
В Visual Studio 2010 результат выглядит следующим образом (обратите внимание на большую разницу между константным и неконстантным глобальным):
Переменная: 0x002af444
Const varialbe: 0x002af440
Параметр: 0x002af43c
Глобальное const: 0x00a02104
Глобальное неконстантное: 0x00a03018