如果我要在循环内声明一个变量,那么在循环之外使用声明会更快吗?程序是否在每次迭代时重新分配 n 的内存,或者在整个过程中使用相同的内存位置?
n
for(int i=0;i<10;i++) { int n = getNumber(); printf("%d\n",n); }
与
int n; for(int i=0;i<10;i++) { n = getNumber(); printf("%d\n",n); }
变量并非真正“创建”或“破坏” . 它们是编程语言抽象层次的概念 . 编译器不需要在变量和内存地址之间进行一对一映射 . 实际上,大多数情况下,局部变量的堆栈空间在函数开头一次分配,因此它不会对性能产生影响 .
注意,C与C(不具有构造函数的概念)不同,它支持对象构造和销毁,因此如果要在for循环中定义类类型的变量,如下所示,
class MyClass { public: MyClass() { cout << "hello world" << endl; } }; //... for (int i = 0; i < 10; ++i) { MyClass m; }
你每次都会调用它的构造函数,有效地打印“hello world”十次 . 这与C声明非常不同,不应与之混淆 .
任何现代编译器都会将它们优化为相同的机器代码,因此您应该看不出任何区别 .
对于大多数现代编译器而言,这并不重要 . 它们将分配处理器寄存器或尽可能有效地将变量放在堆栈上 .
3 回答
变量并非真正“创建”或“破坏” . 它们是编程语言抽象层次的概念 . 编译器不需要在变量和内存地址之间进行一对一映射 . 实际上,大多数情况下,局部变量的堆栈空间在函数开头一次分配,因此它不会对性能产生影响 .
注意,C与C(不具有构造函数的概念)不同,它支持对象构造和销毁,因此如果要在for循环中定义类类型的变量,如下所示,
你每次都会调用它的构造函数,有效地打印“hello world”十次 . 这与C声明非常不同,不应与之混淆 .
任何现代编译器都会将它们优化为相同的机器代码,因此您应该看不出任何区别 .
对于大多数现代编译器而言,这并不重要 . 它们将分配处理器寄存器或尽可能有效地将变量放在堆栈上 .