Есть ли стоимость "const"? - PullRequest
5 голосов
/ 01 июня 2011

Компиляторы могут иногда использовать тот факт, что некоторая «переменная» является константой для оптимизации, поэтому, как правило, рекомендуется использовать ключевое слово «const», когда это возможно, но есть ли компромисс?

ВКороче говоря, есть ли ситуация, когда использование "const" может на самом деле сделать код медленнее (даже чуть-чуть)?

Ответы [ 4 ]

8 голосов
/ 01 июня 2011

Ключевое слово 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)&param);
    printf("Global const: \t\t0x%08x\n", (int)&g);
    printf("Global non-const: \t0x%08x\n", (int)&not_const);

}

В Visual Studio 2010 результат выглядит следующим образом (обратите внимание на большую разницу между константным и неконстантным глобальным):

Переменная: 0x002af444
Const varialbe: 0x002af440
Параметр: 0x002af43c
Глобальное const: 0x00a02104
Глобальное неконстантное: 0x00a03018

4 голосов
/ 01 июня 2011

Сочетание "const" и "неконстантных" объектов может причинить вам серьезный вред довольно неожиданным образом. Какой-то псевдокод:

//in some file far far away...
SomeType firstVariable;
const SomeType secondVariable;

здесь эти переменные выглядят так, как будто они расположены по соседним адресам.

На многих архитектурах они будут расположены далеко друг от друга, поскольку переменные "const" будут помещены в специальный сегмент, который имеет защиту от записи во время выполнения. Таким образом, чередующийся доступ к этим переменным приведет к большему количеству промахов, чем вы ожидаете, и это может значительно замедлить вашу программу.

2 голосов
/ 01 июня 2011

Вы можете представить себе архитектуру, в которой есть память, недоступная для записи во время выполнения программы и доступ к этой памяти медленнее, чем доступ к "обычной" памяти (например, из-за дополнительных проверок при каждом доступе).Это крайне маловероятно - в большинстве случаев «const» будет работать по крайней мере так же быстро, как и «не-const».

1 голос
/ 01 июня 2011

Оптимизатор всегда может выйти из строя различными интересными способами, в данном случае и другими.Например, недавно у меня возникла проблема, когда оптимизатор GCC заменил вызов memcmp машинной инструкцией.Предполагалось, что это будет быстрее, но в 64-битной архитектуре кажется, что эта инструкция была эмулирована, и она оказалась медленнее, чем явно закодированный цикл внутри memcmp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...