C 和 C++ 使用 goto 时汇编代码中的 jmp 指令差异

UPi*_*nar 2 c c++ assembly visual-studio-2022

我在 C 和 C++ 中使用相同的代码片段。

#include <stdio.h>

int main() {
    goto myLabel;
    printf("skipped\n");
myLabel:
    printf("after myLabel\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用 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  
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

问题是为什么 C++ 汇编代码使用 2 个jmp指令,而 C 使用 1 个指令。

P K*_*mer 6

在调试版本(msvc bug 数据库)中的设计是这样的,请参阅: S2019(调试,x86)为一个 goto 语句生成两个相同的 JMP 指令

  • 也许这个答案应该扩展为说明如何链接到 C++ 析构函数放置,如链接页面中所述。 (3认同)