局部变量的顺序:在cpp中声明变量(大小不同)的最佳方式

时间:2013-04-02 07:30:40

标签: c++ variables local

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

以增加的大小顺序声明优先顺序,反之亦然。

在任一场景中用内存布局解释它。

是根据声明的顺序还是根据大小为本地变量分配内存。

int fun()
{

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

3 个答案:

答案 0 :(得分:3)

在C ++中声明(和初始化)局部变量的最佳位置正好在它首次需要时。

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

答案 1 :(得分: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);
       ...
    }
}

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


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

答案 2 :(得分: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
}

对于不复杂的编译器,它有助于优化,对于用户来说,它有助于跟踪信息。此外,它有助于保持内存占用尽可能小,因为本地人超出了范围(原文如此!),即他们的析构函数被调用。