C编程:从汇编程序的角度来看++ i和i = i + 1之间的区别?

Fan*_*ngo 16 c compiler-construction assembly compilation compiler-optimization

这是一个面试问题.我说他们是一样的,但这被判定为不正确的回应.从汇编程序的角度来看,有什么可以想象的区别吗?我使用默认的gcc优化和-S编译了两个简短的C程序来查看汇编程序输出,它们是相同的.

Kri*_*son 19

面试官可能想要这样的答案:

i=i+1将必须加载值i,添加一个,然后将结果存储回来i.相反,++i可以简单地使用单个汇编指令递增值,因此理论上它可以更有效.但是,大多数编译器会优化差异,生成的代码将完全相同.

FWIW,你知道如何看待汇编的事实使你成为一个比我多年来不得不采访的人中的90%更好的程序员.请您放心,因为您不必与采访过您的无能的失败者一起工作.

  • 从汇编的角度来看,这是正确的,但是所有x86处理器都会对两个指令序列执行相同的操作 - inc [memadr]无论如何都需要将值加载到隐藏的寄存器中.但是会发出不同数量的代码. (3认同)
  • 无论如何,现代 SSA 编译器不会重写整个语句吗?第一条语句变为 i_2=i_1+1,第二条语句也变为 i_2=i_1+1。可能 i_1 和 i_2 变量没有分配相同的寄存器。 (2认同)

spe*_*der 10

看起来你是对的,他们错了.我在求职面试中遇到了类似的问题,在那里我给出了被认为是错误的正确答案.

我自信地向我的采访者提出了这一观点,他显然对我的无礼感到不满.我没有得到这份工作,但是再一次,在"知道一切"的人之下工作也不是那么可取.

  • 这是值得争论的 - 我有同样的经历,指出面试官在哪里以及为什么错,并得到了这份工作. (3认同)
  • 同意 给出正确答案总是比您认为面试官想要的答案更好。好的面试官会想要雇用比自己聪明的人。 (2认同)

cle*_*tus 8

你可能是对的.一个天真的编译器可能会:

++i to inc [ax]
Run Code Online (Sandbox Code Playgroud)

i = i + 1 to add [ax], 1
Run Code Online (Sandbox Code Playgroud)

但任何半合理的编译器都会优化为第一个版本添加1.

这一切都假设相关的架构有inc并添加指令(如x86那样).


pli*_*nth 7

为了保护面试官,背景就是一切.我的类型是什么?我们在谈论C或C++(或其他类似的C语言)吗?你得到了:

++i;
i = i + 1;
Run Code Online (Sandbox Code Playgroud)

还是有更多的背景?

如果我被问到这个问题,那么我的第一反应是"我是不是很不稳定?" 如果答案是肯定的,那么差异就很大了.如果不是,差异很小且是语义上的,但实际上没有.证明是解析树的差异,以及生成的子树的最终意义.

所以听起来你的语用方面是正确的,但语义/批判思想方面是错误的.

为了攻击面试官(没有上下文),我不得不想知道问题的目的是什么.如果我问这个问题,我想用它来查明候选人是否知道细微的语义差异,如何生成解析树,如何批判性地思考等等.我通常会问一个关于我的受访者的C问题,几乎每个候选人都会出错 - 那就是设计.我实际上并不关心问题的答案,我关心我将与候选人达成谅解的旅程,这在琐事问题上告诉我更多关于是非的错误.