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

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

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

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

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

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

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

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

 ++i to inc [ax] 

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

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

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

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

 ++i; i = i + 1; 

还是有更多的背景?

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

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

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

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

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