Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否更喜欢使用寿命更长/作用域更大的局部变量?_C++_C - Fatal编程技术网

C++ 是否更喜欢使用寿命更长/作用域更大的局部变量?

C++ 是否更喜欢使用寿命更长/作用域更大的局部变量?,c++,c,C++,C,今天,当我编码时,我想到了这个问题。 当我们想要定义和使用一个变量时,我们应该把它的范围扩大还是不扩大?特别是当同一个变量将在多个块语句中使用时,但是这些块语句与该变量之间没有任何关系。那么哪一个更好呢?让变量位于所有块语句之外,或在每个块语句中定义。举一个这样的例子: 第一: int vl_ret = 0; int b = 1; int c = 1; if (b == 1) { vl_ret = do_something(); if (vl_ret == 1) {

今天,当我编码时,我想到了这个问题。 当我们想要定义和使用一个变量时,我们应该把它的范围扩大还是不扩大?特别是当同一个变量将在多个块语句中使用时,但是这些块语句与该变量之间没有任何关系。那么哪一个更好呢?让变量位于所有块语句之外,或在每个块语句中定义。举一个这样的例子:

第一:

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");
    }
}
或 第二:

由于这些局部变量是从堆栈中分配的,因此速度非常快,我们可以在第二种方法中通过从堆栈中分配来忽略花费的时间


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

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

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


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

我始终建议将变量的范围保持尽可能小(生命周期尽可能短)。它在读取代码时更加清晰(这个变量做什么?),并有助于防止意外地将变量用于错误的事情。没有什么比看到一个
bTemp
bTemp2
在一个函数中重复使用15个位置更糟糕的了

不要担心变量太多,或者在涉及范围时进行任何形式的优化。如果编译器可以确定两个变量从不同时使用(就像第二个示例中的两个
vl_ret
变量),它可能会将它们放在堆栈上的同一位置(就像它们是同一个变量一样)

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

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

你想得对。也就是说,在以下情况下,您可能偶尔会出于不相关的目的重新使用变量:

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

您的代码中有很多错误。请把它们修好。示例:
if(vl_ret=1)
很抱歉,我已经修复了它们,并且此代码不是用于运行的。您发布的代码应该始终是可执行的:-这句话很清楚,非常感谢。它很有用,非常感谢。好的,我能理解你这样的话吗,我如何处理这个问题,应该根据实际情况。在大多数情况下,我们应该尽可能地缩小变量的范围,特别是当变量不是我自己新的/malloc时?是的,这是一种合理的方法。通常情况下,小范围内,你会注意到这是一个痛苦的某个原因,然后可以考虑利弊。
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");
    }
}