2010-10-07 25 views
1

特别是C++,如果它很重要,但我想象的答案在于汇编代码。更快地重复使用通用作用域中定义的变量还是重新定义每个内部作用域中的变量?

如果我们在一个共同作用域(比如一个函数)中使用了多个相同类型变量的块,那么定义常用作用域中的变量并在每个块中重新初始化变量会更快,或者重新定义初始化它在每个块(或没有根本的区别)?

例子:

int i; 

{//block 1 
    i = SomeFunction(); 
    ... 
} 

{//block 2 
    i = SomeOtherFunction(); 
    ... 
} 

{//block 1 
    int i = SomeFunction(); 
    ... 
} 

{//block 2 
    int i = SomeOtherFunction(); 
    ... 
} 

回答

2

我猜大多数编译器产生这两种情况下和int相同的代码,但我个人更倾向于第二种方案,因为i是在尽可能小的范围内。

4

如果i是POD类型(例如您的示例中显示的int),几乎肯定没有任何区别。

如果i的某些类型具有非平凡构造函数或赋值运算符执行某些令人兴奋的操作,那么可能会有很大差异,您必须比较适当的构造函数和赋值运算符的作用。如果两个块都输入了,那么你还需要考虑析构函数。

一般来说,你不应该担心它。采用更简洁的方法,尽可能在最有限的范围内声明变量,尽量接近第一次使用的范围,如果分析器告诉你这是性能问题点,那么只重构变量。

+0

不平凡的构造函数*或析构函数* ...? – 2010-10-07 04:02:38

+0

这取决于输入哪个块,是的。如果输入了两个块,则如果将该变量声明为本地,则会导致额外的对象破坏。如果没有块被输入,显然你不会得到任何破坏(并且没有创建!) – 2010-10-07 04:27:30

1

如果它不是结构/类,它基本上是一样的(尽管寄存器分配更明显地不受内部块的使用限制,这可能有助于优化器,但是任何需要该级别帮助的优化器都应该被放入一家养老院)。

对于类,它取决于构造函数/析构函数和operator =()的相对性能。因此,没有单一的正确答案。尽管如此,在更加局部的范围内创建变量通常是更好的编程实践,并且这种担忧通常会占主导地位。

+0

在那种情况下,我会在良好的编程实践方面犯错,而不是尝试微小的优化,除非优化结果在特定案件不那么微小。 – Innominate 2010-10-07 04:11:59