gpt4 book ai didi

.net - 为什么我的变量在 Debug 模式下被初始化,而在 Release 模式下却没有?

转载 作者:行者123 更新时间:2023-12-04 14:41:04 25 4
gpt4 key购买 nike

我有一个使用 VC++ dot net 3 构建的 Windows 窗体应用程序。有一个整型变量 int x。

当我在 Debug模式下运行应用程序时,x = 0 的值;但是当我在不调试的情况下运行应用程序时,该值是巨大的 113901996。

变量初始化为 int x = 0

为什么会这样?我需要检查一些设置?

最佳答案

编辑:根据您的新信息,您忘记初始化变量,这种行为是预期的。您正在读取垃圾内存。

现在,即使您确实初始化了变量,您仍然可以通过不以影响程序可观察行为的方式使用它来复制此行为。这是我原来的答案所处理的 - 我将留在这里以供将来引用。

你真的在使用 x 吗?如果您只是对其进行初始化,优化器很可能会排除整个事情。

如果它不影响程序的可观察行为,优化器可以自由地从二进制文件中删除任何内容。

watch 也可能在骗你,我在 Release 模式下看到过这种情况。

你能发布一些重现问题的最小代码吗?

如果你用一些输出来测试它,即:

cout << x;

我相信您会看到 x0

编辑:

只是为了把事情弄清楚:

int main()
{
int x = 0;
x = 3;
return 0;
}

将转换为(在 Release模式下,经过全面优化):

00401000  xor         eax,eax 
00401002 ret

变量不仅没有赋值,甚至不存在;与调试版本相反:

00411370  push        ebp  
00411371 mov ebp,esp
00411373 sub esp,0CCh
00411379 push ebx
0041137A push esi
0041137B push edi
0041137C lea edi,[ebp-0CCh]
00411382 mov ecx,33h
00411387 mov eax,0CCCCCCCCh
0041138C rep stos dword ptr es:[edi]
0041138E mov dword ptr [x],0
00411395 mov dword ptr [x],3
0041139C xor eax,eax

其中变量 x 被创建并赋值两次(参见 mov dword ptr [x],0mov dword ptr [x],3)。

如果可观察输出被变量修改,即:

int main()
{
int x = 0;
x = 3;
cout << x;
return 0;
}

生成的二进制文件如下所示:

00401000  mov         ecx,dword ptr [__imp_std::cout (40203Ch)] 
00401006 push 3
00401008 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char>
0040100E xor eax,eax

即使如此,也不会实际生成 x,而是将 3 值放入堆栈并直接打印。

但是在这种情况下观察到的行为是相同的,因为打印了 3。对于用户来说,应该是3x的值是被打印,还是直接打印3,是无关紧要的。

底线是:如果程序的行为没有被某些语句改变,它们就被排除在外。在你的例子中,甚至没有创建变量 x

关于.net - 为什么我的变量在 Debug 模式下被初始化,而在 Release 模式下却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8587686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com