Visual C++ 2008でこのコードを試しましたが、AとBには同じアドレスがないことがわかりました。C++のスタックとスコープ
コンパイラがない理由を私は理解していないint main()
{
{
int A;
printf("%p\n", &A);
}
int B;
printf("%p\n", &B);
}
しかし、Bが定義されますとき、Aはもう存在しないため、同じスタックの場所が再利用できるように私には思える...
非常に単純な最適化(より大きな変数や再帰関数などの文脈では問題になる可能性がある)のように見えます。そして、それはCPUやメモリ上で重くなる再利用のようには思われません。誰にもこれについての説明がありますか?
私は答えが "見た目よりもはるかに複雑だから"という行に沿っていると思いますが、正直言って私は分かりません。
edit:以下の回答とコメントに関するいくつかの精度。
このコードの問題は、この関数が呼び出されるたびにスタックが「1つの整数が大きすぎます」ということです。もちろん、これは例では問題ありませんが、大きな変数と再帰呼び出しを考慮すると、簡単に回避できるスタックオーバーフローがあります。
私が示唆しているのはメモリの最適化ですが、パフォーマンスがどのように損なわれるかわかりません。
そして、これはリリースで行われ、ビルドでは、すべての最適化が行われます。
リリースビルドまたはデバッグビルドをコンパイルしていますか? – Michael
あなたが示唆しているものは、**宇宙**の最適化ですが、必ずしも速度の最適化ではありません。 –
すべての地方自治体が大きすぎてキャッシュラインに収まらない場合は、キャッシュミスがないので速度最適化になります。 – Michael