4

私のコンピュータサイエンスIIのクラスでは、教授は++、-、*=などを2つの操作と見なしています。ただし、アセンブリレベルでは、これは実際には2つの操作ではありません。誰かが説明できますか、それとも単純化のためだけですか?

4

9 に答える 9

9

実際には、読み取り、インクリメント (または何でも)、書き込みの 3 つの操作であると考えています。これは、ある種の共有メモリからある種のローカル ストレージ (レジスタやスタックなど) に読み取り、ローカル ストレージで操作してから書き戻すことを前提としています。

アセンブリ レベルでの操作の数は、インクリメントする対象、プラットフォーム、ハードウェアなどによって異なります。

于 2009-01-14T15:49:13.413 に答える
8

++ (例: b++) は簡略化されているため

b = b + 1 

そこには 2 つの操作があります。加算 (b + 1) と、元の変数への加算値の代入です。

于 2009-01-14T15:49:46.003 に答える
2

複雑さの分析を行うときになぜわざわざするのですか?ただのO(1)です:-)

編集:あなたがそれを投票するとき、理由を私に知らせてください。質問は複雑さのタグが付けられているので、実際の定数ではなく、大きなOの概念が最も重要であると思います。さらに、他の回答ですでに述べたように、これがいくつの操作であるかは、操作のカウント方法、プラットフォーム、コンパイラーなど、多くの要因によって異なります。

于 2009-01-14T16:00:00.990 に答える
1

いくつか推測してみます。

  • あなたの教授はインタープリター言語について言及していますか?
  • ++i は i++ とは異なります。おそらく彼はそれを指していますか?
  • 彼が選択したアセンブリ言語には、中間ストレージ変数が必要なのでしょうか?

    add reg_temp, reg_i, 1
    mov reg_i, reg_temp
    
于 2009-01-14T15:55:24.417 に答える
0

私の意見では、文脈によって2つの意味があり、それを見るときは常にそれらを思い出さなければならないので、2以上にする必要があります。

a = b++と同じですa = b; b = b + 1

a = ++bと同じですb = b + 1; a = b

これは、ほとんどの1年生を崖から追い出すのに十分な混乱です。

于 2009-01-14T16:14:45.373 に答える
0

ずいぶん前に聞いた、ちょっと した「陪審員が出ていない」問題を思い出しました。

「プリインクリメントはポストインクリメントより速い」

私は簡単なグーグル検索をしました。

  1. 多くの人が今でもそれを真実だと思っています。
  2. 他の人は、コンパイラが非常に最適化されているため、比較対象の高レベル コード コードをベンチマークできないと主張しています。
  3. しかし、違いはないと主張する人もいます。
于 2009-01-14T16:09:05.993 に答える
0

アディションプラスセッターじゃないの?

i+=1 に似ていますか?

于 2009-01-14T15:49:02.323 に答える
0

教授はおそらく、値を取得し、それに1を追加してから、変数に代入する必要があることを言及しているだけです.

于 2009-01-14T15:50:38.857 に答える
0

アセンブリ レベルでは、すべてがレジスタで行われるため、A に変数があります。

ADD AX,1

ただし、コンパイル済み言語ではすべてを格納する必要があるため、i++ は (疑似アセンブリで) になります。

MOV AX,i
ADD AX, 1
MOV i, AX

これは 3 つの操作です...基本的なアーキテクチャを完全に忘れていない限り...

于 2009-01-14T15:56:20.827 に答える