是否更长寿命/更大范围的局部变量?

时间:2013-12-03 02:25:41

标签: c++ c

今天,当我编码时,这个问题发生在我身上。 当我们想要定义和使用变量时,我们是否应该扩大其范围?特别是当在几个块语句中使用相同的变量时,这些块语句与这个变量之间没有任何关系。哪个更好?让变量在所有块语句之外,或在每个块语句中定义。举个这样的例子:

FIRST:

int vl_ret = 0;
int b = 1;
int c = 1;

if (b == 1)
{
    vl_ret = do_something();

    if (vl_ret == 1)
    {
        printf("1\n");
    }
    else
    {
        printf("0\n");
    }
}

if (c == 1)
{
    vl_ret = do_something();

    if (vl_ret == 1)
    {
        printf("1\n");
    }
    else
    {
        printf("0\n");
    }
}

或 第二:

int b = 1;
int c = 1;

if (b == 1)
{
    iny vl_ret = do_something();

    if (vl_ret = 1)
    {
        printf("1\n");
    }
    else
    {
        printf("0\n");
    }
}

if (c == 1)
{
    int vl_ret = do_something();

    if (vl_ret = 1)
    {
        printf("1\n");
    }
    else
    {
        printf("0\n");
    }
}

因为这些局部变量是从堆栈中分配的,所以它可以非常快,我们可以忽略第二种方法中分配表单堆栈所花费的时间。

我认为,第二个更好,因为我只需要在每个块语句中使用此变量,如果我不需要它,我可以轻松修改我的代码。在第二种方法中,代码更清晰。我们可以看到,该变量也不会受到其他块语句的影响。

3 个答案:

答案 0 :(得分:7)

通常,缩小范围通常会提高可读性和理解度,因为在大多数情况下,它允许您在一个屏幕或更少的屏幕上查看变量的整个生命周期。

没有什么比调试在一个页面上设置变量的一些代码更糟糕了,然后在三页后使用它,特别是如果连接是无意的。

您通常不需要担心使用“太多”变量,因为大多数情况下,编译器会自动处理它们的分配。如果变量不再“活动”,编译器将为您透明地重用存储。

答案 1 :(得分:1)

  

我认为,第二个更好,因为我只需要在每个块语句中使用此变量,如果我不需要它,我可以轻松修改我的代码。在第二种方法中,代码更清晰。我们可以看到,该变量也不会受到其他块语句的影响。

你认为对。也就是说,如果出现以下情况,您可能偶尔会决定将变量用于不相关的目的:

  • 您需要关注性能问题(例如,重复使用的许多标准容器通常会执行更少的动态内存分配,但是在所有使用结束并最终离开范围之前,可能无法释放峰值内存)和/或
  • 在许多本地范围(例如,嵌套命名空间/类名和/或模板参数的长列表)中重新创建变量是一种冗长/混淆的痛苦,特别是如果您需要引入范围来控制变量的生命周期。

答案 2 :(得分:0)

我总是建议尽量保持变量的范围尽可能小(尽可能短)。它在阅读代码时更清楚(这个变量做了什么?),并且有助于防止意外地使用变量来处理错误的事情。没有什么比看到bTempbTemp2在一个函数中重复使用15个位置更糟糕了。

在范围方面,不要担心“太多”变量或任何类型的优化。如果编译器可以确定从不同时使用两个变量(比如第二个例子中的两个vl_ret变量),那么它可能会将它们放在堆栈的相同位置(就好像它们是相同的变量)。

另外,不要关心堆栈变量的“分配”。通常,在首次调用函数时会设置整个堆栈帧,因此会立即保留所有变量的空间。