【问题标题】:Difference between += 1 and ++ as executed by computer?由计算机执行的 += 1 和 ++ 之间的区别?
【发布时间】:2018-04-19 01:53:47
【问题描述】:

计算机对 C++ 中这两个表达式执行的命令是否相同:

myInt += 1;
myInt ++;

我应该使用 GCC 吗?或者如果你知道答案可以告诉我吗?

【问题讨论】:

  • Java 不能编译成程序集。
  • 它们的值不同:例如int a = myInt += 1;int a = myInt++; 导致a 的值不同(前者类似于++myInt)。所以它们不会编译成相同的代码。
  • 为什么你认为你需要关心它们之间的区别?编写可读代码,让运行时担心纳米优化。
  • @ivomalinowskip - 顺便说一句,有什么东西阻止您自己查看 Java 字节码吗?自己编译一些东西来看看它们是否会产生不同的字节码很容易。
  • @jrook 是的,在大多数情况下字节码会被编译,但不能保证 - JVM 的某些实现可以直接解释字节码,在这种情况下不会有机器级指令。请参阅:stackoverflow.com/questions/1326071/… - 无论哪种方式,Java 代码和最终机器代码之间的关系都是相当间接的,并且充其量是特定于实现的。

标签: c++ increment


【解决方案1】:

对于许多编译器,它们是相同的。 (请注意,我说的是 许多 编译器 - 请参阅下面的免责声明)。例如,对于以下 C++ 代码,Test 1 和 Test 2 将产生相同的汇编语言:

int main()
{
    int test = 0;

    // Test 1
    test++;

    // Test 2
    test += 1;

    return 0;
}

许多编译器(包括 Visual Studio)都可以配置为显示生成的汇编语言,这是解决此类问题的最佳方式。例如,在 Visual Studio 中,我右键单击项目文件,转到“属性”,然后执行以下操作:

在这种情况下,如下图所示,Visual Studio确实,实际上是将它们编译成相同的汇编语言:

; Line 8
    push    ebp
    mov ebp, esp
    sub esp, 204                ; 000000ccH
    push    ebx
    push    esi
    push    edi
    lea edi, DWORD PTR [ebp-204]
    mov ecx, 51                 ; 00000033H
    mov eax, -858993460             ; ccccccccH
    rep stosd
; Line 9
    mov DWORD PTR _test$[ebp], 0
; Line 12 - this is Test 1
    mov eax, DWORD PTR _test$[ebp]
    add eax, 1
    mov DWORD PTR _test$[ebp], eax
; Line 15 - This is Test 2 - note that the assembly is identical
    mov eax, DWORD PTR _test$[ebp]
    add eax, 1
    mov DWORD PTR _test$[ebp], eax
; Line 17
    xor eax, eax
; Line 18
    pop edi
    pop esi
    pop ebx
    mov esp, ebp
    pop ebp
    ret 0
_main   ENDP
_TEXT   ENDS
END

有趣的是,它的 C# 编译器还为类似的 C# 代码生成相同的 MSIL(这是 C# 的“等效”汇编语言),因此这显然也适用于多种语言。

顺便说一句,如果您使用的是 gcc 等其他编译器,您可以按照指示 here 获取汇编语言输出。根据接受的答案,您应该使用-S 选项,如下所示:

gcc -S helloworld.c

如果您使用 Java 编写并想做类似的事情,您可以关注 these directions 使用 javap 获取字节码,可以说是 Java 的“等效”汇编语言。

同样有趣的是,由于这个问题最初是关于 Java 和 C++,this question 讨论了 Java 代码、字节码和最终的机器代码(如果有的话)之间的关系。

警告:不同的编译器可能会产生不同的汇编语言,尤其是当您针对不同的处理器和平台进行编译时。您是否打开优化也会影响事情。因此,严格来说,Visual Studio“足够聪明”知道这两个语句“意味着”同一件事并不一定意味着 all 编译器适用于 all 可能的平台会那么聪明。

【讨论】:

  • 这个答案非常完整,非常好,谢谢。顺便说一句,你知道为什么我有这么多不喜欢吗?
  • 如果提问者自己做一点研究,StackOverflow 效果最好。因此,您可能会因为您根本没有自己查看汇编代码而被否决。投反对票,因为很难理解您为什么要问这样一个似乎相当学术性且与现实世界问题无关的问题。或者投反对票,因为你一开始就弄错了标签。或者投反对票,因为您的问题非常广泛:您没有提到在汇编程序中产生很大差异的处理器架构。所以你看,不难找到拒绝投票的理由。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-01
  • 2020-04-01
  • 2016-02-10
  • 2015-05-16
  • 1970-01-01
  • 2019-07-05
  • 2021-08-30
相关资源
最近更新 更多