首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++编程效率

C++编程效率
EN

Stack Overflow用户
提问于 2011-04-24 05:03:55
回答 5查看 224关注 0票数 3

以下是我从Microsoft Developer Network复制的一些代码

http://msdn.microsoft.com/en-us/library/dd162487(v=VS.85).aspx

代码语言:javascript
复制
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.   
} 
} 

我可能是错的,但我认为每次编译器运行如下语句时:

代码语言:javascript
复制
int var1  
double var2  
char var3[]  
PAINTSTRUCT ps  
HDC hdc  

计算机会创建一个新的变量。至少这是合乎逻辑的事情,因为当你想要创建一个新变量时,这就是你要写的,对吧?

我也一直在想,如果你有一个这样的代码块:

代码语言:javascript
复制
for(int i = 0; i < 100; i++)
    int sum = i;

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

在上面的示例代码中,函数WndProc将在程序过程中被多次调用,但是该函数创建的名为"ps“和"hdc”的两个变量仅在函数执行的某些时候使用。

那么,计算机会不会生成许多永远不会使用的独立的、额外的PAINTSTRUCT和HDC变量呢?

在case WM_PAINT:之后声明"ps“和"hdc”是不是至少更有效率一些?

代码语言:javascript
复制
case WM_PAINT:
{ 
     **PAINTSTRUCT ps;  
     HDC hdc;**

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

回答 5

Stack Overflow用户

发布于 2011-04-24 05:11:22

我可能是错的,但我认为每次编译器运行如下语句时:

代码语言:javascript
复制
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”是不是至少会更有效一点:像这样?

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

最后,对性能的担忧充其量是一种微优化。专注于代码的含义。让编译器尽可能有效地将其转换为可执行代码。只有当您遇到不能满足客户预期性能需求的性能问题时,您才应该开始担心。

票数 2
EN

Stack Overflow用户

发布于 2011-04-24 05:09:14

你是正确的,计算机将声明许多局部变量,但幸运的是,这是非常有效的。当第一次调用函数时,编译器通常会将生成局部变量的代码作为单个汇编指令输出,因此创建这些变量的开销可以忽略不计。在您的循环示例中,编译器通常不会多次创建和销毁变量。相反,它只创建一次,它们在循环的每次迭代中重用空间。换句话说,变量在逻辑上是在每次迭代中创建和销毁的,但在生成的代码中,它实际上是在多次迭代中共享的。

一般来说,不要担心你的程序的效率,除非你有特定的理由相信你的性能低于它应该达到的水平。你的首要任务应该是编写干净、优雅的代码,而不是第一次优化的代码,因为在没有实际运行程序的情况下,很难知道你的优化是否会对程序的运行时产生有用的影响。通常,您将使用分析器来确定代码中哪些部分速度较慢,然后将您的优化工作集中在那里。

票数 1
EN

Stack Overflow用户

发布于 2011-04-24 05:10:40

对于原语局部变量--指针、整型、双精度、浮点型等--和原语数组,声明一个变量确实为它“分配”了空间,但实际发生的是编译器说“我要在堆栈上调用这个点,在堆栈指针下面三个字,i。”没有实际的计算发生--根本没有指令被执行!因此,在循环内部或外部声明"sum“完全没有区别!

然而,对于本地声明的类实例,情况就不同了。声明对象意味着当进入块时将调用构造函数,而在退出时将调用析构函数,这确实会导致指令执行--因此您需要小心。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5766940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档