【问题标题】:Minimalizate visibility VS avoid initialization最小化可见性 VS 避免初始化
【发布时间】:2014-01-17 21:21:20
【问题描述】:

为什么

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!在什么情况下有效?

我是否可以通过在我以后不想使用的变量周围添加 {} 符号来提高程序的运行时间以降低可见性,或者编译器可以轻松有效地维护这些信息,因此无需填写我的带有 {} 的代码?

【问题讨论】:

    标签: performance loops optimization initialization ofstream


    【解决方案1】:

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

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

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

    一般来说,是的,您应该始终以尽可能有限的范围声明对象。但这也是有限制的——当构造或销毁代价高昂时,你应该避免构造比你需要的更多的对象。

    【讨论】:

    • 加上新添加的o.flush(),你的说法仍然有效,但是你能说明一下,什么时候建设或破坏是昂贵的,或者从另一种方法来说,什么时候建设或破坏是便宜的?
    猜你喜欢
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多