C++ 与之间的差异+;=1和++;由计算机执行?
在C++中,计算机对这两个表达式执行的命令是否相同:C++ 与之间的差异+;=1和++;由计算机执行?,c++,increment,C++,Increment,在C++中,计算机对这两个表达式执行的命令是否相同: myInt += 1; myInt ++; 我应该使用GCC吗?或者,如果你知道答案,你能告诉我吗?对于许多编译器来说,它们是相同的。(请注意,我说过许多编译器-请参阅下面的免责声明)。例如,对于下面的C++代码,测试1和测试2都会产生相同的汇编语言: int main() { int test = 0; // Test 1 test++; // Test 2 test += 1; re
myInt += 1;
myInt ++;
我应该使用GCC吗?或者,如果你知道答案,你能告诉我吗?对于许多编译器来说,它们是相同的。(请注意,我说过许多编译器-请参阅下面的免责声明)。例如,对于下面的C++代码,测试1和测试2都会产生相同的汇编语言:
int main()
{
int test = 0;
// Test 1
test++;
// Test 2
test += 1;
return 0;
}
; 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
许多编译器(包括VisualStudio)可以配置为显示生成的汇编语言,这是解决此类问题的最佳方法。例如,在Visual Studio中,我右键单击项目文件,转到“属性”,并执行以下操作:
在本例中,如下图所示,Visual Studio实际上将它们编译为相同的汇编语言:
int main()
{
int test = 0;
// Test 1
test++;
// Test 2
test += 1;
return 0;
}
; 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,则可以按照说明获得汇编语言输出。根据已接受的答案,您应该使用-S
选项,如下所示:
gcc -S helloworld.c
如果您是用Java编写的,并且想做类似的事情,那么可以使用javap
来获取字节码,可以说字节码是Java与汇编语言的“等价物”
也有兴趣,因为这个问题最初是关于java和C++的,它讨论了java代码、字节码和最终的机器代码(如果有的话)之间的关系。
注意:不同的编译器可能会产生不同的汇编语言,尤其是在为不同的处理器和平台编译时。你是否开启了优化也会影响到事情。因此,严格地说,Visual Studio“足够聪明”知道这两条语句“意味着”同一件事的事实并不一定意味着所有可能平台的所有编译器都会那么聪明。Java不会编译成汇编。它们的值不一样:例如
int a=myInt+=1代码>和inta=myInt++
会导致a
的不同值(前者类似于++myInt
)。所以它们不会编译成相同的代码。为什么你认为你需要关心它们之间的差异?写可读代码,让运行时担心纳米优化。@ivomalinowskip-顺便问一下,是否有什么东西阻止您自己查看Java字节码?自己编译一些东西很容易,看看它们是否会产生不同的字节码。@jrook是的,在大多数情况下,字节码都会被编译,但这并不能保证——JVM的一些实现可以直接解释字节码,在这种情况下,不会有机器级指令。请参阅:-无论哪种方式,Java代码和最终机器代码之间的关系都是间接的,最好是特定于实现的。这个答案非常完整,非常好,谢谢。顺便说一句,你知道为什么我有这么多不喜欢的东西吗?如果提问者自己做一点调查,StackOverflow效果最好。因此,您可能会得到否决票,因为您根本没有查看汇编代码。投反对票是因为很难理解为什么你会问这样一个问题,这似乎是学术性的,与现实世界的问题无关。或者因为你一开始就把标签弄错了而投反对票。或者因为你的问题非常广泛而投反对票:你没有提到处理器架构,它在汇编程序中有很大的不同。所以你看,找到否决投票的理由并不难。