ホームページ >バックエンド開発 >C++ >「const」とコンパイラの最適化により、同じメモリ アドレスにある 2 つの変数が異なる値を保持するにはどうすればよいでしょうか?

「const」とコンパイラの最適化により、同じメモリ アドレスにある 2 つの変数が異なる値を保持するにはどうすればよいでしょうか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-24 18:46:43113ブラウズ

How Can Two Variables at the Same Memory Address Hold Different Values Due to `const` and Compiler Optimizations?

共有アドレスの個別データ: パズル

提供されたコード スニペットでは、2 つの変数が同じメモリ アドレスを占有しているように見えますが、保持されています。異なる価値観。このパラドックスを解明するには、const のセマンティクスと、その動作を再定義できる可能性のあるコンパイラの最適化を理解することが重要です。

gt;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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。