我在C和C++中使用相同的代码片段。
#include <stdio.h>
int main() {
goto myLabel;
printf("skipped\n");
myLabel:
printf("after myLabel\n");
return 0;
}
使用Visual Studio 2022 IDE和编译器。
C++汇编代码
0000000140001000 sub rsp,28h
0000000140001004 jmp 0000000140001014
0000000140001006 jmp 0000000140001014
0000000140001008 lea rcx,[0000000140004230h]
000000014000100F call 0000000140001090
0000000140001014 lea rcx,[0000000140004240h]
000000014000101B call 0000000140001090
0000000140001020 xor eax,eax
0000000140001022 add rsp,28h
0000000140001026 ret
C的汇编代码
0000000140001000 sub rsp,28h
0000000140001004 jmp 0000000140001012
0000000140001006 lea rcx,[0000000140006000h]
000000014000100D call 0000000140001090
0000000140001012 lea rcx,[0000000140006010h]
0000000140001019 call 0000000140001090
000000014000101E xor eax,eax
0000000140001020 add rsp,28h
0000000140001024 ret
问题是为什么C++汇编代码使用2jmp指令,而C使用1。
2条答案
按热度按时间kkbh8khc1#
在调试版本(msvc错误数据库)中,其设计与此类似,请参见:S2019 (debug, x86) generates two identical JMP instructions for one goto statement
lnxxn5zx2#
C和C++是两种完全不同的编程语言。
不同的编译器被用来编译它们,实际的编译器可能是一个单一的,单片的程序,但是在功能上有两个逻辑上不同的编译器和算法,它们彼此没有任何关系。
不同的编译器会从语法相同的源代码生成不同的编译代码,这并不完全出乎意料。编译代码的差异是由不同的编译器在翻译源代码时所采用的不同算法造成的。这些差异并不具有特殊的、固有的意义。