方法 1 还是方法 2 哪个更受欢迎?
方法一:
LRESULT CALLBACK wpMainWindow(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
switch (msg)
{
case WM_PAINT:
{
HDC hdc;
PAINTSTRUCT ps;
RECT rc;
GetClientRect(hwnd, &rc);
hdc = BeginPaint(hwnd, &ps);
// drawing here
EndPaint(hwnd, &ps);
break;
}
default:
return DefWindowProc(hwnd, msg, wparam, lparam);
}
return 0;
}
方法二:
LRESULT CALLBACK wpMainWindow(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rc;
switch (msg)
{
case WM_PAINT:
GetClientRect(hwnd, &rc);
hdc = BeginPaint(hwnd, &ps);
// drawing here
EndPaint(hwnd, &ps);
break;
default:
return DefWindowProc(hwnd, msg, wparam, lparam);
}
return 0;
}
在方法1中,如果调用wpMainWindow函数时msg = WM_PAINT,是否一开始就为栈上的所有变量分配内存?还是只有当它进入 WM_PAINT 范围时?
方法一会不会只在message为WM_PAINT时才使用内存,而方法二不管msg等于什么都会使用内存吗?
最佳答案
变量应尽可能在本地声明。
在“函数顶部”声明变量始终是一种非常糟糕的做法。即使在 C89/90 语言中,变量只能在 block 的开头声明,最好尽可能在本地声明它们,即在覆盖变量所需生命周期的最小局部 block 的开头。有时,引入一个“冗余”本地 block ,其唯一目的是“本地化”变量声明,这甚至可能是有意义的。
在 C++ 和 C99 中,可以在代码中的任何位置声明变量,答案非常简单:再次,尽可能在本地声明每个变量,并尽可能靠近使用它的位置第一次。这样做的主要理由是,在大多数情况下,这将允许您在声明时为变量提供有意义的初始化程序(而不是在没有初始化程序或使用虚拟初始化程序的情况下声明它)。
至于内存使用,一般一个典型的实现会立即(当你输入函数时)为同时存在的所有变量分配所需的最大空间。但是,您的声明习惯可能会影响该空间的确切大小。例如,在这段代码中
void foo() {
int a, b, c;
if (...) {
}
if (...) {
}
}
所有三个变量同时存在,通常必须为所有三个变量分配空间。但是在这段代码中
void foo() {
int a;
if (...) {
int b;
}
if (...) {
int c;
}
}
在任何给定时刻只存在两个变量,这意味着典型实现将只为两个变量分配空间(b
和 c
将共享相同的空间) .这是尽可能在本地声明变量的另一个原因。
关于c++ - 在函数顶部或单独的范围内声明变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3773396/