gpt4 book ai didi

c++ - 在 {} 范围内声明变量时,它们还会使用内存吗?

转载 作者:可可西里 更新时间:2023-11-01 17:38:33 24 4
gpt4 key购买 nike

在这个例子中,即使我永远不会使用变量 WNDCLASSEX、x、y、cx、cy,当我在消息循环中时它们仍然会使用内存:

int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpArgs, int iCmdShow)
{
WNDCLASSEX wc;
...
RegisterClassEx(&wc);

const int cx = 640;
const int cy = 480;
// center of the screen
int x = (GetSystemMetrics(SM_CXSCREEN) - cx) / 2;
int y = (GetSystemMetrics(SM_CXSCREEN) - cy) / 2;

CreateWindow(..., x, y, cx, cy, ...);

MSG msg;

while (GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}

但我想知道,如果我将它们放在一个范围内,它们在消息循环期间是否仍会使用内存?例如

int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpArgs, int iCmdShow)
{
{
WNDCLASSEX wc;
...
RegisterClassEx(&wc);

const int cx = 640;
const int cy = 480;
// center of the screen
int x = (GetSystemMetrics(SM_CXSCREEN) - cx) / 2;
int y = (GetSystemMetrics(SM_CXSCREEN) - cy) / 2;

CreateWindow(..., x, y, cx, cy, ...);
}

MSG msg;

while (GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}

或者如果我将它们放入两个函数中并在 winmain 中调用它们,例如

wnd_register(hInst);
wnd_create(hInst);

这会阻止他们使用内存吗?

最佳答案

编译器在处理简单的局部变量方面有很大的余地,就像您在示例中所做的那样。它们可能存在于堆栈中,它们可能仅作为机器代码中的立即值存在,或者它们可能仅存在于寄存器中。堆栈空间通常在函数入口处分配。编译器将从堆栈指针中减去一些值以为所有局部变量腾出空间。在函数返回时,堆栈指针恢复到它的原始值。这通常不会在不同范围 block 的退出时完成。一旦不再使用变量,大多数编译器将尝试积极地重用堆栈空间。在您的示例中,x 和 msg 在堆栈上具有完全相同的地址是完全合法的,因为它们的用法不重叠。

我对 this question 的回答详细介绍了如何在堆栈上分配局部变量。

在您的示例中,常量 cx 和 cy 很可能在运行时没有内存支持它们,并且在生成的代码中只是立即值。 x 和 y 很可能会存在于寄存器中,直到需要将它们压入堆栈以调用 CreateWindow。 wc 和 msg 几乎肯定会在堆栈上。

你不应该担心这个级别的微优化——让编译器在它认为合适的时候为局部变量分配空间。默认情况下,您有一个 1 MB 的堆栈,这些变量消耗的数据量甚至不会注册为噪音。把时间花在担心更有趣的问题上。

关于c++ - 在 {} 范围内声明变量时,它们还会使用内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4675783/

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