2015-04-21 2 views
4

Преимущества квалификатора 'const' обсуждались в различных вопросах, но эти обсуждения касаются главным образом отказов от непреднамеренной модификации и ясности намерения. Я хотел бы спросить, есть ли какая-либо разница в полученной программе из-за использования квалификатора, в частности, есть ли выигрыш в производительности?Достоинства спецификатора const в C11

В одном из других вопросов было отмечено, что компилятор не может использовать естественное предположение о том, что объект не изменяется, если он передан функции с квалификатором const, учитывая существование в C++ «const_cast». Это не в C11, поэтому const позволяет любые оптимизации в C11, которые будут пропущены без него?

Другая возможность различий в производительности заключается в макете памяти в случае статических объектов. Есть ли преимущество в производительности для наличия объекта в пространстве только для чтения? Это может быть зависимо от аппаратного обеспечения, меня бы интересовали как общие идеи, так и комментарии, относящиеся к конкретным конфигурациям.

EDIT: Было бы очень широкой просьбой дать общий аргумент, утверждающий, что не может быть увеличения производительности, необходимого для использования «const». Однако отрицание этого утверждения, вероятно, будет довольно кратким ответом. Таким образом, чтобы быть более конкретно, и не исключая ничего адресация мой общий вопрос, ответ формы, которые будут особенно полезны следующие:

  1. Любой пример случая, когда прирост производительности достигается с помощью «сопзЬ» в необходимым способом.

  2. Любой аргумент относительно того, почему компилятор не может сделать оптимизацию из-за использования 'const'. Это, вероятно, не будет специфичным для аппаратного обеспечения, и поэтому, если это так, возможно, это можно кратко сформулировать. Если это нужно более конкретно, меня больше всего интересует использование «const» в вызовах функций.

  3. Любой ответ на вопрос, можно ли использовать память только для чтения со статическими объектами для достижения выигрыша в производительности на настольных или серверных реализациях x86-64.

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

+2

Вы говорите о определителе констант для объектов или о целевом типе указателя? Последствия для производительности совершенно разные. –

+0

Мне был бы интересен любой случай. Я хочу получить представление о том, когда, если вообще когда-либо, есть преимущество производительности при использовании 'const'. – jack

+0

Пространство ответов обширно. В значительной степени зависит от использования. Можете ли вы дать некоторое представление о своей области приложений или это вопрос строго академический? Я могу попытаться сгенерировать некоторые тесты и прочитать сборку из компиляторов, но кто скажет, что мои тесты даже отдаленно релевантны вам? – Jeff

ответ

3

Я предполагаю, что в принципе, компилятор может оптимизировать больше, когда код содержит много const квалификатор.

Я полагаю, что со следующим кодом:

extern void foo(const int*const); 

int bar(const int*const arr) { 
    int k = arr[0]; 
    foo(arr); 
    return k+arr[0]; 
} 

умный оптимизирующий компилятор может загрузить arr[0] только один раз (и держать k в локальной по вызову foo)

Похоже gcc-4.9 является неспособный (или не желающий) такой оптимизации, но clang-3.5 оптимизирует его (оба с -O3 -fverbose-asm на Linux/x86-64).

BTW, это не относится к C11, я считаю, что с семантикой C99 компилятор также может оптимизировать.

+0

Действительно ли стандарт позволяет * такую ​​оптимизацию? Мое ожидание - нет, и такая оптимизация может быть безопасно сделана только во время связи. – Hurkyl

+0

@ Хуркил: Я считаю, что это разрешено. Если вы считаете, что «clang» ошибочно, отправьте ему отчет об ошибке. –

+2

Действительно, я надеялся, что у вас есть стандартная ссылка для резервного копирования вашего требования. :(Попробуйте создать программу, в которой 'bar' вызывается с динамически распределенным массивом, а' foo' отбрасывает константу и изменяет 'arr [0]'. Делает ли «clang» еще оптимизацию? Также версия, где 'bar 'вызывается с адресом глобального массива' extern', и 'foo' реализуется для модификации этого массива с помощью глобального указателя. – Hurkyl

Смежные вопросы