最小化可见性 VS 避免初始化



Why

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!

我可以通过在以后不想使用的变量周围添加 {} 符号来降低可见性,或者编译器可以轻松有效地维护这些信息,这样就不需要用 {} 填充我的代码,从而改善程序的运行时?

在第一个循环中,每次通过循环构建和销毁ofstream。 构造函数打开文件;析构函数刷新缓冲区并关闭文件。 这些操作并不便宜。

在第二个循环中,你构造一次ofstream,在循环的所有迭代中使用一个对象,然后销毁它一次(当它稍后超出范围时)。 您只打开文件一次,并且只关闭文件一次。

编译器无法将第一个循环转换为第二个循环(反之亦然),因为它们不等效:打开和关闭文件是具有外部影响的操作。

通常,是的,您应该始终声明具有尽可能有限范围的对象。 但是这样做是有限制的 - 当构造或设计成本很高时,您应该避免构建比您需要的更多的对象。

最新更新