Немного другой пример:
const int *global_ptr = 0;
void bar();
void foo() {
int x = 1;
global_ptr = &x;
bar();
std::cout << x << "\n";
}
Компилятор не может оптимизировать последнюю строку, чтобы использовать значение 1
, потому что для всех известных ему bar()
принимает значение global_ptr
, преобразует егона int*
и изменяет x
через него.Это было бы несколько рискованным кодированием, но исключение квалификатора const и мутирования допустимо при условии, что ссылка на действительно изменяемый объект, поэтому компилятор должен допустить это.
Но, если x
помечено const
тогда будет недопустимым , чтобы bar()
отбрасывал const и мутировал, и поэтому оптимизатор может предположить, что x
по-прежнему содержит значение 1
при печати.
Оптимизаторы, безусловно, идентифицируют константы времени компиляции для такого рода оптимизации, поэтому я не удивлюсь, увидев, что это имеет значение для испускаемого кода.Насколько это влияет на производительность, я не знаю.Нетрудно сгенерировать случаи, когда идентификация константы может, например, заменить (дорогое) деление на некоторое (более дешевое) переворот в битах, или может позволить выражениям, включающим x
и кучу других констант, вычисляться во время компиляции, а не во время выполнения..
Кроме того, оптимизация времени соединения может позволить встроить bar
, и в этом случае оптимизатор времени соединения может более тщательно проверять свое содержимое и может исключить возможность изменения x
в неконстантном случае.
В вашем примере, однако, никакая ссылка на colors
не может скрыться от неизвестного кода, поэтому разница не возникает.В любом случае, const-строку, вероятно, сложнее оптимизировать, чем const int, поэтому вероятность того, что вы включите блестящую оптимизацию с помощью const
.
, еще меньше.