c++ - 在函数顶部或单独的范围内声明变量?

标签 c++ c function stack

方法 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;
  }
}

在任何给定时刻只存在两个变量,这意味着典型实现将只为两个变量分配空间(bc 将共享相同的空间) .这是尽可能在本地声明变量的另一个原因。

关于c++ - 在函数顶部或单独的范围内声明变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3773396/

相关文章:

c++ - 有没有办法从流中获取 "\n"?

c++ - MS Visual Studio 2010 Professional Project Designer 没有出现?

c - Gradle undefined reference `WinMain@16' 错误

c++ - 如何让 Clang Complete 显示函数参数?

c++ - new/malloc 或 delete/free 是否占用或使缓存行无效?

c++ - 解释这个闰年函数C++

c - C(Linux) 中的套接字 - 如何获取客户端 IP 和端口

c - 字符设备驱动程序中的套接字通信

C++ 对象函数错误消息

c - Makefile:扩展依赖项