私のコンピュータサイエンスIIのクラスでは、教授は++、-、*=などを2つの操作と見なしています。ただし、アセンブリレベルでは、これは実際には2つの操作ではありません。誰かが説明できますか、それとも単純化のためだけですか?
9 に答える
実際には、読み取り、インクリメント (または何でも)、書き込みの 3 つの操作であると考えています。これは、ある種の共有メモリからある種のローカル ストレージ (レジスタやスタックなど) に読み取り、ローカル ストレージで操作してから書き戻すことを前提としています。
アセンブリ レベルでの操作の数は、インクリメントする対象、プラットフォーム、ハードウェアなどによって異なります。
++ (例: b++) は簡略化されているため
b = b + 1
そこには 2 つの操作があります。加算 (b + 1) と、元の変数への加算値の代入です。
複雑さの分析を行うときになぜわざわざするのですか?ただのO(1)です:-)
編集:あなたがそれを投票するとき、理由を私に知らせてください。質問は複雑さのタグが付けられているので、実際の定数ではなく、大きなOの概念が最も重要であると思います。さらに、他の回答ですでに述べたように、これがいくつの操作であるかは、操作のカウント方法、プラットフォーム、コンパイラーなど、多くの要因によって異なります。
いくつか推測してみます。
- あなたの教授はインタープリター言語について言及していますか?
- ++i は i++ とは異なります。おそらく彼はそれを指していますか?
彼が選択したアセンブリ言語には、中間ストレージ変数が必要なのでしょうか?
add reg_temp, reg_i, 1 mov reg_i, reg_temp
私の意見では、文脈によって2つの意味があり、それを見るときは常にそれらを思い出さなければならないので、2以上にする必要があります。
a = b++
と同じですa = b; b = b + 1
と
a = ++b
と同じですb = b + 1; a = b
これは、ほとんどの1年生を崖から追い出すのに十分な混乱です。
ずいぶん前に聞いた、ちょっと した「陪審員が出ていない」問題を思い出しました。
「プリインクリメントはポストインクリメントより速い」
私は簡単なグーグル検索をしました。
- 多くの人が今でもそれを真実だと思っています。
- 他の人は、コンパイラが非常に最適化されているため、比較対象の高レベル コード コードをベンチマークできないと主張しています。
- しかし、違いはないと主張する人もいます。
アディションプラスセッターじゃないの?
i+=1 に似ていますか?
教授はおそらく、値を取得し、それに1を追加してから、変数に代入する必要があることを言及しているだけです.
アセンブリ レベルでは、すべてがレジスタで行われるため、A に変数があります。
ADD AX,1
ただし、コンパイル済み言語ではすべてを格納する必要があるため、i++ は (疑似アセンブリで) になります。
MOV AX,i
ADD AX, 1
MOV i, AX
これは 3 つの操作です...基本的なアーキテクチャを完全に忘れていない限り...