这是我从 Microsoft Developer Network 复制的一些代码
http://msdn.microsoft.com/en-us/library/dd162487(v=VS.85).aspx

LRESULT APIENTRY WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

**PAINTSTRUCT ps;
HDC hdc;**

switch (message)
{
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);
        TextOut(hdc, 0, 0, "Hello, Windows!", 15);
        EndPaint(hwnd, &ps);
        return 0L;

    // Process other messages.
}
}

我可能错了,但我认为每次编译器运行这样的语句时:
int var1
double var2
char var3[]
PAINTSTRUCT ps
HDC hdc

计算机将创建一个新变量。至少这是合乎逻辑的想法,因为这就是您要创建新变量时所写的内容,对吗?

我也一直认为,如果你有这样的代码块:
for(int i = 0; i < 100; i++)
    int sum = i;

计算机将创建 100 个不同的变量,所有变量都具有相同的名称 sum 和一些包含在 i 中的值

在上面的示例代码中,函数 WndProc 在程序运行过程中会被多次调用,但是函数创建的两个变量“ps”和“hdc”只会在函数执行的部分时间被使用.

那么计算机是否会生成许多永远不会使用的单独的、额外的 PAINTSTRUCT 和 HDC 变量?
在案例 WM_PAINT 之后声明“ps”和“hdc”不是至少稍微更有效:像这样吗?
case WM_PAINT:
{
     **PAINTSTRUCT ps;
     HDC hdc;**

     hdc = BeginPaint(hwnd, &ps);
     TextOut(hdc, 0, 0, "Hello, Windows!", 15);
     EndPaint(hwnd, &ps);
 }
 return 0L;

最佳答案


int var1
double var2
char var3[]
PAINTSTRUCT ps
HDC hdc



这些变量对应于运行时的存储空间。由于它们是局部变量,因此它们可能存在于堆栈中,为这些局部变量分配空间就像移动堆栈指针一样简单。这是非常快的。



这里可能会发生的是,堆栈上的相同位置将被重复用于循环的每次迭代。



不,它们是局部变量,它们很可能在堆栈上分配,并且一旦进入方法,它们的空间就会被保留,而与您在代码中声明它们的位置无关。

最后,担心这里的性能充其量只是一个微优化。专注于代码的含义。让编译器尽可能有效地将其翻译成可执行代码。只有当您遇到不符合客户预期性能要求的性能问题时,您才应该开始担心。

关于C++编程效率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5766940/

10-11 21:25