我应该明确地定义变量吗?

时间:2013-04-22 05:00:53

标签: c++ scope

这更像是一个样式问题,因为我知道在实践中大多数编译器可能会优化以产生相同的效果,但我一直在阅读,一般来说,你应该总是在范围内声明/定义变量使用。因此,在我无法内联声明的情况下,例如下面的代码片段,我已经考虑将索引变量括在作用域括号中(大括号,不确定在这种情况下你称它们是什么),以便明确地限制这些变量的范围。这是好习惯吗?如果是这样,你能解释一下原因吗?

{
    size_t i = 0; // this variable has no use outside of the range-based for loop
    for (auto const input : input_vector)
    {
        neuron_sequence[i].ForceSignal(input);
        ++i;
    }
}

4 个答案:

答案 0 :(得分:5)

当然这是一个很好的做法。它明确限制了可以使用该变量的位置。我经常这样做。像这样的范围也用于强制一些对象析构函数运行。

例如:

std::vector<int> v;
v.resize( 10 ); // now holds memory for 10 ints

你如何清理这段记忆?无法调用任何函数或以任何方式手动告诉向量v清理其内存。解决方案是强制它超出范围(假设我正确使用了交换):

std::vector<int> v;
v.resize( 10 ); // now holds memory for 10 ints
{
  std::vector<int> temp;
  temp.swap( v );
} // temp goes out of scope and clears the memory that v used to hold

另一种常见用法是在交换机案例中。通常我需要在交换机中创建一个临时变量:

switch( val )
{
case constant:
  {
    int x = 10;
    // ... do stuff
  }
}

我记得的最后一个地方就是编写某些代码的测试用例。当经常对单元进行测试时,我只想尽可能快地编写测试代码而不需要花费太多时间。所以,我在一个函数中放置了一堆相关的测试,但是将局部变量包装在不同的范围内只是为了确保我没有遇到任何奇怪的错误(可能通过测试共享迭代器)。

答案 1 :(得分:3)

是的,你应该明确地设定变量范围:

  1. 范围定义局部变量的生命周期,因此适当地确定变量的范围意味着变量只有在它们满足其期望的用途时才能存活。不只是活着,还要记忆。
  2. 如果命名变量相同,则本地可变量隐藏或隐藏相同的命名全局变量。因此,使范围显式提高了读者的可读性。( Atleast我感觉如此

答案 2 :(得分:2)

对于像整数这样的小数据类型,你真的不需要担心,因为正如你所说的那样,编译器会根据变量的 liveness 来优化代码,以及是否 reaches 某个地点。在这种情况下,它更像是一种风格问题。我建议不要经常这样做,因为代码可读性和易维护性也是性能的一个重要因素。

然而,对于复杂类型,限制生命周期可能是有用的。例如,对于内部分配大量内存的向量,如果其范围受限,则可以节省一些空间。

答案 3 :(得分:0)

  • 当您发现自己关注对象的生命周期时,范围很小 - 通常是因为使用了内存/资源,或者希望防止意外或有助于故意重用相同的标识符
    • e.g。做一些重复的操作 - 甚至可能使用宏替换 - 需要临时替换,但更改名称没有特定目的,而且很乏味
  • 你不能总是这样做:你会遇到很多情况,其中适合一个变量的最小可能范围与另一个变量的范围重叠:例如试图在a中“范围”{ X a = 1; X b(a, 2); ++a; } ++b;过早地摧毁b
  • 在某些情况下,创建大量小范围可能会使源代码大量膨胀,从而使视觉接收和维护变得更加困难。有一些精神上的努力来检查引入的范围没有控制if / for / while语句,并且一眼就能看到整体功能流更难。当然,减少功能范围之外的变量数量也可以减少精神上的努力 - 所以这是一种平衡行为。

总体而言 - 选择它是很好的,但是你会在有需要的时候产生一种感觉。如果不确定,那可能无关紧要。