以下是我从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变量呢?
在case 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; 发布于 2011-04-24 05:11:22
我可能是错的,但我认为每次编译器运行如下语句时:
int var1
double var2
char var3[]
PAINTSTRUCT ps
HDC hdc 计算机会创建一个新的变量。
这些变量对应于运行时的存储空间。因为它们是本地变量,所以它们很可能位于堆栈上,为这些本地变量分配空间就像移动堆栈指针一样简单。这是非常快的。
我也一直认为,如果你有这样一段代码:
( int = 0;i< 100;i++) int sum = i;
计算机将创建100个不同的变量,所有变量都具有相同的名称"sum“和包含在"i”中的一些值。
这里可能发生的情况是,堆栈上的相同位置将在循环的每次迭代中重复使用。
在case WM_PAINT之后声明"ps“和"hdc”是不是至少会更有效一点:像这样?
不,它们是本地变量,它们很可能是在堆栈上分配的,一旦进入方法,它们的空间就会被保留,而与您在代码中声明它们的位置无关。
最后,对性能的担忧充其量是一种微优化。专注于代码的含义。让编译器尽可能有效地将其转换为可执行代码。只有当您遇到不能满足客户预期性能需求的性能问题时,您才应该开始担心。
发布于 2011-04-24 05:09:14
你是正确的,计算机将声明许多局部变量,但幸运的是,这是非常有效的。当第一次调用函数时,编译器通常会将生成局部变量的代码作为单个汇编指令输出,因此创建这些变量的开销可以忽略不计。在您的循环示例中,编译器通常不会多次创建和销毁变量。相反,它只创建一次,它们在循环的每次迭代中重用空间。换句话说,变量在逻辑上是在每次迭代中创建和销毁的,但在生成的代码中,它实际上是在多次迭代中共享的。
一般来说,不要担心你的程序的效率,除非你有特定的理由相信你的性能低于它应该达到的水平。你的首要任务应该是编写干净、优雅的代码,而不是第一次优化的代码,因为在没有实际运行程序的情况下,很难知道你的优化是否会对程序的运行时产生有用的影响。通常,您将使用分析器来确定代码中哪些部分速度较慢,然后将您的优化工作集中在那里。
发布于 2011-04-24 05:10:40
对于原语局部变量--指针、整型、双精度、浮点型等--和原语数组,声明一个变量确实为它“分配”了空间,但实际发生的是编译器说“我要在堆栈上调用这个点,在堆栈指针下面三个字,i。”没有实际的计算发生--根本没有指令被执行!因此,在循环内部或外部声明"sum“完全没有区别!
然而,对于本地声明的类实例,情况就不同了。声明对象意味着当进入块时将调用构造函数,而在退出时将调用析构函数,这确实会导致指令执行--因此您需要小心。
https://stackoverflow.com/questions/5766940
复制相似问题