提供されたコード スニペットでは、2 つの変数が同じメモリ アドレスを占有しているように見えますが、保持されています。異なる価値観。このパラドックスを解明するには、const のセマンティクスと、その動作を再定義できる可能性のあるコンパイラの最適化を理解することが重要です。
コードconst int 変数 N を値 22 で初期化します。 const へのポインタを非 const へのポインタに独創的にキャストすることにより、N のアドレスへのポインタ pN を取得します。その後、pN が指す値が 33 に変更され、次のような siguientes 出力が得られます。
N: 22 Address: 0x22ff74 *pN: 33 Address: 0x22ff74
どうやら、同じメモリ位置を参照しているにもかかわらず、N と *pN は両方とも異なる値を持っています。この一見矛盾は、const 値をコンパイル時の定数として解釈するコンパイラの最適化に起因します。
このシナリオでは、コンパイラは N の値が決して変更されないことを認識します。コードを最適化して、N へのすべての参照を実際の値に置き換え、事実上 const 指定をバイパスします。この最適化は基本的に、
*pN = 33;
を
22 = 33;
に変換します。この割り当ては明らかに無効であるため、コンパイラはエラーを報告します。ただし、問題のコードは、変更された値を、pN が元々指していた場所に割り当てます。この動作は、コンパイラが、指すアドレスが const であっても、const ポインタが指すメモリを変更できるようにするために発生します。
したがって、N は const であるため、元の値 22 を保持します。この指定では、pN は 33 を含むように変更された場所を指します。最終的に、同じメモリ アドレスを占有しているにもかかわらず、N と *pN は異なる値を保持しており、コンパイラの最適化が強力な役割を果たしていることがわかります。コードの実行を形成します。
以上が「const」とコンパイラの最適化により、同じメモリ アドレスにある 2 つの変数が異なる値を保持するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。