1
class A{
    const size_t number;
public:
    A(size_t number): number(number) {}
    void f(){
        //read number, possibly save in CPU register
        //call a function that the compiler can't inspect
        //    so it should assume that anything in the program state changed
        //read number again
    }

そこで、number再度読み取る場合、コンパイラー(最適化がオンになっている場合)は変更できないと想定します。変更されているためconst、CPUレジスターからフラグを読み取ります(以前にフラグが配置されていた場合)。

4

1 に答える 1

2

答えは、特定のコンパイラの実装の詳細に依存するということです。
constの正しさの主な目的は、自分が正直な間違いを犯したり、保守が容易なより直感的なコードを記述したりするのを防ぐことです。
コンパイラの最適化は、(ほとんど)何かを作るための基準であってはなりませんconst

優れたコンパイラは、その最適化を適用してconst変数をインライン化する場合がありますが、そうでない場合もあります。
変数のアドレスがconstどこかにあるかどうかなどのいくつかの要因も、コンパイラーがそれを処理する方法に影響を与える可能性があります。

最後に、変数を宣言した後のコンパイラの処理方法に関係なく、constコードは常にconstであると想定する必要があります。変更しないでください。ハッカーで変更すると、未定義動作が発生します。

于 2012-06-06T09:10:24.083 に答える