为什么
for (int i=0; i<1e6; ++i)
{
ofstream o("out.txt",ios_base::app);
o<<i;
}
慢于
ofstream o("out.txt",ios_base::app);
for (int i=0; i<1e6; ++i)
{
o<<i;
o.flush()
}
?我认为第一个更快是因为o
的可见性在第一种情况下比在第二种情况下更少,如果o
的初始化成本太高,编译器会优化它并且基本上基于第二个创建二进制代码。通常,在循环内部或外部定义变量的建议是什么?在什么情况下有效Variables should be defined as late as possible!
?
我可以通过在以后不想使用的变量周围添加{}符号来改善程序的运行时间,以降低可见性,或者编译器可以轻松有效地维护这些信息,因此无需填写我的使用{}的代码?
答案 0 :(得分:0)
在第一个循环中,每次循环构造并销毁ofstream
。构造函数打开文件;析构函数刷新缓冲区并关闭文件。这些操作并不便宜。
在第二个循环中,构造ofstream
一次,在循环的所有迭代中使用该一个对象,然后将其销毁一次(当它超出范围之后)。您只打开一次文件而只关闭文件一次。
编译器无法将第一个循环转换为第二个循环(反之亦然),因为它们不等效:打开和关闭文件是具有外部效果的动作。
通常,是的,您应该始终声明具有尽可能有限的范围的对象。但是这里有一些限制 - 当建造或拆除费用昂贵时,你应该避免构建超出你需要的物体。