【发布时间】:2024-01-19 10:54:01
【问题描述】:
在我的计算机科学 II 课上,教授认为 ++、--、*= 等是 2 个操作。但是,在组装级别,这并不是真正的两个操作。有人可以解释一下还是只是为了简单起见?
【问题讨论】:
标签: loops complexity-theory analysis
在我的计算机科学 II 课上,教授认为 ++、--、*= 等是 2 个操作。但是,在组装级别,这并不是真正的两个操作。有人可以解释一下还是只是为了简单起见?
【问题讨论】:
标签: loops complexity-theory analysis
我实际上认为它是 3 个操作:读取、递增(或其他)、写入。这是假设它从某种共享内存读取到某种本地存储(例如寄存器或堆栈),在本地存储上操作,然后回写。
在装配级别有多少操作取决于您要增加的内容、平台、硬件等。
【讨论】:
因为 ++(例如:b++)是
的简化b = b + 1
那里有两个操作,加法(b + 1),然后将加法的值赋值给原始变量。
【讨论】:
在进行复杂性分析时为什么要麻烦?这只是 O(1) :-)
编辑:请在您投反对票时告诉我原因。由于这个问题被标记为 complexity,我认为大 O 概念是最重要的,而不是实际的常数。此外,正如其他答案中已经提到的,这是多少操作取决于很多因素:您计算操作的方式、平台、编译器等。
【讨论】:
我会猜测一些。
也许他选择的汇编语言需要中间存储变量?
add reg_temp, reg_i, 1
mov reg_i, reg_temp
【讨论】:
不是加法加setter吗?
类似于 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 相同
这足以让大多数一年级学生陷入困境。
【讨论】: