在我的计算机科学 II 课上,教授认为 ++、--、*= 等是 2 个操作。但是,在组装级别,这并不是真正的两个操作。有人可以解释一下还是只是为了简单起见?
9 回答
我实际上认为它是 3 个操作:读取、递增(或其他)、写入。这是假设它从某种共享内存读取到某种本地存储(例如寄存器或堆栈),在本地存储上操作,然后写回。
它在装配级别有多少操作将取决于您要增加的内容、平台、硬件等。
因为 ++(例如:b++)是
b = b + 1
那里有两个操作,加法(b + 1),然后将加法的值分配给原始变量。
做复杂性分析时为什么要麻烦?这只是 O(1) :-)
编辑:当你投票否决时,请告诉我为什么。由于这个问题被标记为complex,我认为大 O 概念是最重要的,而不是实际的常数。此外,正如其他答案中已经提到的,这有多少操作取决于很多因素:您计算操作的方式、平台、编译器等。
我来猜几个。
- 你的教授指的是解释语言吗?
- ++i 与 i++ 不同,也许他指的是那个?
也许他选择的汇编语言需要中间存储变量?
add reg_temp, reg_i, 1 mov reg_i, reg_temp
不是加法加二传手吗?
类似于 i+=1?
教授可能只是指必须取值,将其加 1,然后将其分配回变量。
在汇编级别,一切都在寄存器中完成,因此在 A 中有一个变量
ADD AX,1
但是,在编译语言中,所有内容都必须存储,因此 i++ 变为(在伪汇编中)
MOV AX,i
ADD AX, 1
MOV i, AX
这是三个操作...除非我完全忘记了我的基本架构...
你让我想起了我很久以前听到 的一个有点“陪审团没有出局”的问题。
“前增量比后增量快”
我刚刚做了一个快速的谷歌搜索。
- 很多人仍然认为这是真的。
- 其他人则认为编译器已经如此优化,无法对比较高级的代码进行基准测试。
- 然而,其他人则认为没有区别。
在我看来它应该超过 2,因为它根据上下文有两种含义,当我看到它时,我总是要提醒自己。
a = b++
是相同的a = b; b = b + 1
和
a = ++b
是相同的b = b + 1; a = b
这足以让大多数一年级学生陷入困境。