const
nie pomaga optymalizatorowi.
Od const
można wyrzucać z const_cast
, możliwe jest pisanie programów, które używają const
w wielu miejscach, a następnie rzucił ją i modyfikować zmienne w każdym razie, z zachowaniem określonej zgodnie z normą. Dlatego też kompilator musi przyjrzeć się faktycznemu kodowi programu, aby określić, które zmienne są modyfikowane, i prawdopodobnie jest w tym całkiem dobry (na przykład może określić, że zmienna niezmienna jest niezmienna w stosunku do określonego bloku kodu i odpowiednio zoptymalizować).
Jeśli kompilator ślepo potraktował const
jako gwarancję, że coś nie ulegnie zmianie, optymalizator złamie dobrze uformowane programy.
const
jest funkcją czasu kompilacji, która pomaga programistom pisać poprawny kod, dodając pewne ograniczenia podczas kompilacji i wskazując kontrakt kodu (np. "Obiecuję, że nie zmienię tego parametru"). Nie ma nic wspólnego z optymalizacją. Chociaż niezmienniki są ważne dla optymalizatorów, nie ma to nic wspólnego ze słowem kluczowym const
.
Istnieje jeden wyjątek: obiekty zadeklarowane jako const
. Nie można ich modyfikować; nawet jeśli są przez rzutowanie, zachowanie jest niezdefiniowane. Jest trochę subtelności tutaj:
const int ci = 5;
const_cast<int&>(ci) = 5; // undefined behavior, original object declared const
int i = 5;
const int& ci2 = i; // cannot modify i through ci2, const reference
const_cast<int&>(ci2) = 5; // OK, original object not declared const
Więc gdy kompilator widzi const int ci
prawdopodobnie robi założyć, że nigdy, przenigdy nie zmieni, ponieważ modyfikacji jest niezdefiniowane zachowanie. Jest jednak duża szansa, że nie jest to wąskie gardło w twoim programie, jest po prostu bardziej wyrafinowanym #define
. Poza tym const
jest słaby - tylko słowo kluczowe dla systemu typu.
To zależy od optymalizatora, czyż nie? – dmckee