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

时间:2009-05-15 09:10:33

标签: c compiler-construction assembly compilation compiler-optimization

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

6 个答案:

答案 0 :(得分:18)

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

  

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

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

答案 1 :(得分:10)

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

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

答案 2 :(得分:8)

你可能是对的。一个天真的编译器可能会这样做:

++i to inc [ax]

i = i + 1 to add [ax], 1

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

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

答案 3 :(得分:7)

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

++i;
i = i + 1;

还是有更多背景?

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

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

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

答案 4 :(得分:3)

在C ++中,它取决于i是int还是对象。如果它是一个对象,它可能会生成一个临时实例。

答案 5 :(得分:0)

上下文是主要的事情,因为在优化的发布版本中,如果i ++可用于简单的[inc eax],编译器将优化掉i ++。而像int some_int = i ++这样的东西需要将i值存储在some_int FIRST中,然后才增加i。