将C/C 变量放在未命名范围中的原因

Reasons for putting C/C++ variables in an unnamed scope?

本文关键字:范围 变量 未命名      更新时间:2023-10-16

可能的重复:
我可以使用块来管理C 中变量的范围吗?

我遇到了一些类似于的C 代码:

int main(void) {
  int foo;
  float qux;
  /* do some stuff */
  {
    int bar;
    bar = foo * foo;
    qux = some_func(bar);
  }
  /* continue doing some more stuff */
}

最初,我认为原始作者也许是在使用牙套来分组一些相关变量,但是由于设计系统没有大量的内存,所以我认为作者可能有意让 bar's示波器解决和任何变量都在走开中,而不是将它们带到整个封闭( foo的)范围中。

有什么理由这样做吗?在我看来,这不是必要的,任何现代编译器都使这是不必要的?

在我看来,这不是必要的,任何现代编译器都会使它不必要?

是的,在这种情况下,现代编译器将优化内存使用量。额外的范围不会使代码更快或更高的内存效率。

但是,他们无法用具有副作用的破坏者优化对象,因为这会改变程序的行为。因此,这对于此类对象是有意义的。

有什么理由这样做吗?

将相关代码分组在一起很有用。您知道在其他任何地方都不会使用牙套内声明的变量,这很有帮助。

如果您以一种方法多次进行操作,则可能导致该方法占用堆栈空间少,具体取决于您的编译器。如果您的资源有限,则可能是在微控制器上,并且它们的编译器并不总是像X86编译器那样完整。

另外,如果您使用完整的类(而不是ints& floats)进行操作,则可以使您可以控制攻击器的位置。

class MyClass;
int main(void) {
    int foo;
    float qux;
    /* do some stuff */
    {
        MyClass bar;
        qux = some_func(bar);
    } // <-- ~MyClass() called here.
    /* continue doing some more stuff */
}

在c/c 的情况下,一个人可以尝试限制名称之间的冲突(函数的时间很长,需要一个范围的范围来范围范围,这是一个坏主意...)即在相同功能中,多个bar比以这种方式划分它们会确保它们不会相撞/互相覆盖。

通常,内部功能范围不会影响堆栈分配大小 - 对于所有局部变量,堆栈都是预先分配给所有局部变量的。

如果代码真的像您所显示的,则可能毫无意义。我看到的大多数编译器在输入该函数时为所有本地变量分配了空间,并将其从函数退出时将其释放。不过还有其他一些可能性。

如果您显示为bar的内容是某种类型的对象(尤其是具有破坏者的东西),则驱动器将从范围中退出,即使该空间直到后来才释放。

另一种可能性是确实有两个内部范围:

int main() { 
// ...
    { 
        // some variables
    }
// ...
    {
        // other variables
    }
}

在这种情况下,进入本地变量的空间将在输入时分配给main - some variablesother variables(通常)将(通常)共享相同的空间。即,分配的空间足以容纳两者中的较大较大的空间,但(通常)不是两者的总和,因为如果您在 main的范围中定义了所有变量,则会使用。

打算解决bar的范围和任何变量的意图 离开,而不是让它们在整个封闭(foo的)中四处走动 范围

这可能是一个(不重要的遗产)原因。
另一个原因是将其传达给读者,即int bar仅在此范围内使用,以具有很小的功能(函数内部功能)。之后不使用bar

您的代码等效于:

  inline void Update (int &foo, float &qux)
  {
    int bar = foo * foo;
    qux = some_func(bar);
  }
  int main ()
  {
    ...
    Update(foo, qux);
    ...
  }

大多数编译器都会在main()内部优化对Update()的调用,并在INLINE内部进行了与您发布的相似的呼叫。

它可能是为了帮助程序员,而不是优化输出,因为现代编译器肯定足够聪明,可以看到临时变量仅使用一次。

另一方面,对于程序员而言,它添加了逻辑分离,这意味着"这些变量仅适用于此代码",也许"此代码不影响此功能中的其他代码。"