0

我目前正在审查代码,并且有许多不同大小的局部变量。

是按大小递增的顺序声明更可取的一个,反之亦然。

在任何一种情况下都用内存布局来解释它。

是根据声明顺序或大小为局部变量分配的内存。

int fun()
{

  struct *ptr;
  int var1;
  long double *ld;
  .
  .
  .
  .
}
4

3 回答 3

3

在 C++ 中声明(和初始化)局部变量的最佳位置就在第一次需要它的地方。

变量的大小根本不应该是一个考虑因素,除非你有相反的具体证据。

于 2013-04-02T07:34:52.227 回答
1

编译器会在优化时重新排序局部变量。简而言之,同一范围内的变量顺序无关紧要。

不过,好主意是在使用它的范围内声明局部变量,例如:

void func() {
    //int i, j; // not here!
    for (int i = 0 ; i<10; ++i) {
       int j = func2(i);
       ...
    }
    // i and j below are different variables than i and j above
    // you can consider changing their names if they also have different meaning
    for (int i = 0 ; i<10; ++i) { 
       int j = func3(i);
       ...
    }
}

尽管对于良好的优化编译器,从性能或内存占用的角度来看,这可能无关紧要(它会检测到何时使用变量)。它仍然会使代码更具可读性,并避免在不同范围内混合不相关的值,从而防止编译器警告未捕获的一些愚蠢错误(因为编译器不知道您何时意外忘记重新初始化重用变量,但它会知道你是否忘记初始化一个新变量)。


另外,担心变量(或任何东西)时很重要的一点:记得打开编译器的警告,比如-Wall -Wextragcc。此外,使用valgrind是个好主意(如果您可以让您的代码在具有 valgrind 的操作系统上运行)。

于 2013-04-02T07:40:20.897 回答
0

我的方法是,我在尽可能小的范围内声明局部变量,在范围的开头,例如

void foo()
{
    int local1 = 42;
    int local2 = bar(local1);

    if ( local2 != local1)
    {
        double local3 = double(local2)/double(local1);
        MyMemoryAllocatingObject mmao; // large memory allocation, deallocation in destructor

        baz(local3);
        bat(mmao);
    } // mmao memory gets freed here
}

对于不复杂的编译器,它有助于优化,对于用户,它有助于跟踪信息。另外,它有助于使内存占用尽可能小,因为局部变量超出范围(原文如此!),即调用了它们的析构函数。

于 2013-04-02T07:51:16.477 回答