これはインタビューの質問でした。同じだと言いましたが、これは誤答と判断されました。アセンブラの観点から、想像できる違いはありますか? アセンブラーの出力を確認するために、デフォルトの gcc 最適化と -S を使用して 2 つの短い C プログラムをコンパイルしましたが、それらは同じです。
6 に答える
インタビュアーは、次のような回答を望んでいた可能性があります。
i=i+1
の値をロードしi
、それに 1 を追加してから、結果を に保存する必要がありi
ます。対照的に++i
、単一のアセンブリ命令を使用して値を単純にインクリメントする場合があるため、理論的にはより効率的である可能性があります。ただし、ほとんどのコンパイラは違いを最適化し、生成されるコードはまったく同じになります。
FWIW、アセンブリの見方を知っているという事実は、私が何年にもわたってインタビューしなければならなかった人々の 90% よりも優れたプログラマーになります。あなたにインタビューした無知な敗者と一緒に仕事をする必要がないという事実に安心してください.
あなたが正しくて、彼らが間違っていたようです。就職の面接で同様の問題があり、間違っていると見なされた正しい答えを出しました.
私は自信を持って面接担当者にその点を主張しましたが、面接担当者は明らかに私の厚かましさに腹を立てました。採用には至りませんでしたが、やはり「何でも知っている」人の下で働くのは、あまり望ましいことではありません。
あなたはおそらく正しいです。素朴なコンパイラは次のようにするかもしれません:
++i to inc [ax]
と
i = i + 1 to add [ax], 1
しかし、中途半端なコンパイラーは、最初のバージョンに 1 を追加して最適化するだけです。
これはすべて、関連するアーキテクチャに inc および add 命令があることを前提としています (x86 のように)。
C++ では、i
が int かオブジェクトかによって異なります。オブジェクトの場合、おそらく一時インスタンスが生成されます。
最適化されたリリースビルドでは、コンパイラが単純な[inc eax]で利用可能な場合、i ++を最適化するため、ここではコンテキストが主なものになります。一方、int some_int = i ++のようなものは、最初にsome_intにi値を格納してから、iをインクリメントする必要があります。