在循环体内声明变量有什么缺点吗?
在循环体内声明变量是否有任何缺点?
在C++中,销毁一个int变量是一个空操作,变量停止存在,但不需要运行任何运行时代码。对于停止存在的变量的引用或指针,行为未定义。在初始化之前,新创建的局部变量具有未定义的状态。因此,简单地将旧变量重用为新变量是合法的,编译器不必证明没有这样的未解引用的引用存在。
在这种情况下,如果编译器可以证明该值是常量100,它甚至可以跳过除第一个初始化之外的所有代码。并且它可以“提前”进行此初始化,因为没有定义的方法可以检测到它发生得早。在这种情况下,这很容易,大多数编译器都会轻松地做到;在更复杂的情况下,就不是那么容易了。如果标记为const,编译器不再需要证明它未被修改,而是可以假设它未被修改!
C++中留下未定义的许多领域存在是为了使某些优化更容易实现。
现在,如果你有一个更复杂的东西,比如vector
因此,在循环体内声明变量的主要缺点是可能导致性能损失,特别是对于复杂的对象或动态分配的变量。为了解决这个问题,可以考虑将变量声明在循环外部,以避免重复的创建和销毁操作。这样可以提高代码的效率和性能。
在循环体内声明变量会导致变量在每次迭代时被销毁和重建。对于小循环和简单数据类型,这可能不会被注意到,因为编译器会进行优化,但是当处理复杂对象和大循环时,最好将变量声明在循环外部。
如果循环中的变量占用过多内存,可以将循环和声明括在大括号中,使括号内分配的所有变量在退出后被删除。大多数情况下,这种微观优化并不重要,但如果您使用复杂的类等,只需在外部初始化变量并在每次迭代时重置即可。
一般来说,声明过多的变量不是一个好主意,这会使您的代码难以阅读并增加内存使用量。如果可能的话,不要在不需要的时候声明变量。例如,您可以将示例简化为for(int i = 0;i<1000000;i++)cout<<i+100;
。如果这样的优化是可能的,并且它们不会使您的代码难以阅读,请使用它们。
"您的示例可以简化为for(int i = 100;y<1000100;y++){cout<<i}
。" 值得注意的是,一个不错的编译器很可能会找到这个,并对代码进行优化,就好像代码是这样编写的。我的建议通常是主要为了人类可读性而编码,只有在分析找到瓶颈后才进行优化。
我说过编译器通常会对这些循环进行优化,只有在循环非常复杂时才需要担心这个问题。
如果变量使您的代码更难阅读,那么您可能在误用/错误命名它们。例如,将+100折叠到循环头中会混淆迭代次数和数字的偏移量。在我看来,这实际上更不清晰。
您是对的。我修改了答案。
for(int i = 0;y<1000000;y++)
-- 在我看来,在循环头中初始化一个在循环条件中未使用的变量看起来仍然很混乱。
对不起,那是一个打字错误。已修复。
声明一个变量在循环体内部的概念上来说,每次迭代都会构造和销毁该变量。但是这会影响性能吗?你可以在这里检查你的情况。删除第7行的int关键字以在循环局部变量和函数局部变量之间切换。
结论是:没有任何区别。汇编代码是一样的!所以,在你的代码中使用有意义的方式。如果你每次迭代都需要一个对象,就创建一个对象。优化器比你想象的聪明。如果这还不够,你可以通过性能分析数据和仔细调整来回来处理,而不是广泛的指导方针。
真是太棒了。所以,从概念上讲,它是不同的,在理论上,这可能会给一个天真的编译器带来性能损失,但在实践中,现代编译器应该能够优化掉这一点。
确实。即使在接触了相当多的C++之后,编译器从其帽子中拉出的优化仍然使我经常惊叹不已。尽可能使用const关键字,并提高优化级别,你会看到奇迹的发生。