这是一道面试题。我说他们是一样的,但这被判定为错误的反应。从汇编程序的角度来看,有什么可以想象的区别吗?我使用默认的 gcc 优化和 -S 编译了两个简短的 C 程序以查看汇编器输出,它们是相同的。
6 回答
面试官可能想要这样的答案:
i=i+1
将不得不加载 的值i
,将其加一,然后将结果存储回i
. 相反,++i
可以使用单个汇编指令简单地增加值,因此理论上它可能更有效。但是,大多数编译器会优化掉差异,生成的代码将完全相同。
FWIW,您知道如何看待汇编这一事实使您成为比我多年来不得不采访的 90% 的人更好的程序员。不必与面试你的无知的失败者一起工作,这让你感到安慰。
看起来你是对的,他们是错的。我在一次求职面试中遇到了类似的问题,我给出了被认为不正确的正确答案。
我自信地与我的面试官争论了这一点,他显然对我的无礼感到生气。我没有得到这份工作,但话又说回来,在“无所不知”的人手下工作也不是那么理想。
你可能是对的。一个天真的编译器可能会这样做:
++i to inc [ax]
和
i = i + 1 to add [ax], 1
但是任何半明智的编译器只会优化将 1 添加到第一个版本。
这一切都假设相关架构具有 inc 和 add 指令(就像 x86 一样)。
为了保护面试官,上下文就是一切。i的类型是什么?我们是在谈论 C 还是 C++(或其他类似 C 的语言)?是否给了你:
++i;
i = i + 1;
还是有更多的背景?
如果有人问我这个问题,我的第一反应会是“我易变吗?” 如果答案是肯定的,那么差异是巨大的。如果不是,则差异很小且语义上的差异,但实际上没有差异。证明是解析树的差异,以及生成的子树的最终含义。
所以听起来你在务实方面是对的,但语义/批判性思维方面是错误的。
为了攻击面试官(没有上下文),我不得不想知道这个问题的目的是什么。如果我问这个问题,我想用它来了解候选人是否知道细微的语义差异、如何生成解析树、如何批判性地思考等等。我通常会问我的面试者一个 C 问题,几乎每个候选人都会出错 - 这是设计使然。实际上,我并不关心问题的答案,我关心的是我将与候选人达成理解的旅程,它告诉我的不仅仅是一个琐事问题的正确/错误。
在 C++ 中,它取决于i
是 int 还是 object。如果它是一个对象,它可能会生成一个临时实例。
上下文是这里的主要内容,因为在优化的版本构建中,如果 i++ 可用于简单的 [inc eax],编译器将优化它。而像 int some_int = i++ 这样的东西需要将 i 值存储在 some_int FIRST 中,然后才增加 i。