环境:
Microsoft Visual Studio Community 2022 (64 位) 版本 17.5.5
程序如下,当单步执行fun()中的三条语句时,实际执行的顺序为:
#include <iostream>
using namespace std;
class A
{
public:
A() { a = 5; }
~A() {}
int a;
};
A fun()
{
A a;
int b = 3;
return a;
}
int main()
{
fun();
return 0;
}
fun()函数的的反汇编:
A fun()
{
00F61FE0 push ebp
00F61FE1 mov ebp, esp
00F61FE3 sub esp, 0F4h
00F61FE9 push ebx
00F61FEA push esi
00F61FEB push edi
00F61FEC lea edi, [ebp - 34h]
00F61FEF mov ecx, 0Dh
00F61FF4 mov eax, 0CCCCCCCCh
00F61FF9 rep stos dword ptr es : [edi]
00F61FFB mov dword ptr[ebp - 0ECh], 0
00F62005 mov ecx, offset _23EFC97D_ConsoleApplication1@cpp(0F6E067h)
00F6200A call @__CheckForDebuggerJustMyCode@4 (0F6137Fh)
A a;
00F6200F mov ecx, dword ptr[a]
00F62012 call A::A(0F614A6h)
00F62017 mov dword ptr[ebp - 0F4h], eax
return a;//这是编译器添加的代码,作用是什么?
00F6201D mov eax, dword ptr[ebp - 0ECh]
00F62023 or eax, 1
00F62026 mov dword ptr[ebp - 0ECh], eax
int b = 3;
00F6202C mov dword ptr[b], 3
return a;
00F62033 mov eax, dword ptr[a]
}
00F62036 push edx
00F62037 mov ecx, ebp
00F62039 push eax
00F6203A lea edx, ds: [0F6205Ch]
00F62040 call @_RTC_CheckStackVars@8 (0F6122Bh)
00F62045 pop eax
00F62046 pop edx
00F62047 pop edi
00F62048 pop esi
00F62049 pop ebx
00F6204A add esp, 0F4h
00F62050 cmp ebp, esp
00F62052 call __RTC_CheckEsp(0F6128Fh)
00F62057 mov esp, ebp
00F62059 pop ebp
00F6205A ret
b = 3 没用到
可能编译器优化掉了
你在b=3后面加上一个 cout << b; 看看