将C/C 变量放在未命名范围中的原因
Reasons for putting C/C++ variables in an unnamed scope?
可能的重复:
我可以使用块来管理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 variables
和other 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内部进行了与您发布的相似的呼叫。
它可能是为了帮助程序员,而不是优化输出,因为现代编译器肯定足够聪明,可以看到临时变量仅使用一次。
另一方面,对于程序员而言,它添加了逻辑分离,这意味着"这些变量仅适用于此代码",也许"此代码不影响此功能中的其他代码。"
- 尝试通过多个向量访问变量时,向量下标超出范围
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 如果非动态变量被指针引用,何时超出范围?
- 为什么我的变量存在于其范围之外
- 变量超出范围后如何保留向量值?
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 在 c++ 中确定堆栈上的变量范围
- 如何改进一堆在已知值范围内评估变量的 else-if 条件?
- 如何从未知视图中声明范围::v3::View 变量
- 如果变量数据包含大于 vector 所有元素的整数,则仅在视觉工作室上接收"矢量下标超出范围"?
- 是否未定义将对函数范围变量的引用作为值返回
- 无法从另一个函数访问文件范围变量的内容
- 如何访问C 中的功能范围变量
- C++ 程序和范围变量
- 性能对象属性与范围变量
- 存储lambda函数,该函数将范围变量捕获为类成员以供重用
- 何时分配块范围变量
- 在 c++ 中声明一个全局范围变量 const