为什么我需要在使用它的循环的每次迭代中清除stringstream变量

时间:2017-04-16 17:59:59

标签: c++ loops clear stringstream

在我的学校,我们必须遵循一个样式指南,该指南指出我们必须在使用它的函数的顶部声明每个变量,而不是在它使用之前。这通常意味着您必须在循环中使用它们时重置或清除变量,因为它们未在该循环内声明。我不明白为什么stringstream变量需要在每次循环迭代时“清除”,并且希望有人能够阐明这一点。我知道如何清除它只是想知道为什么它是必要的。

1 个答案:

答案 0 :(得分:4)

这背后的基本原理是在循环内部创建对象会导致性能下降。 :: std :: stringstream是这些对象之一,并且始终创建和销毁字符串流是一个常见的错误。但是,此类规则不适用于 light 对象,例如基本类型。

考虑test case

#include <chrono>
#include <sstream>
#include <iostream>

int main()
{
    using namespace std;
    using namespace chrono;

    auto const loops_count{1000000};
    auto const p1{high_resolution_clock::now()};
    {
        stringstream ss;
        for(auto i{loops_count}; 0 != i; i--)
        {
            ss.str(string()); // clear
            ss << 1;
        }
    }
    auto const p2{high_resolution_clock::now()};
    {
        for(auto i{loops_count}; 0 != i; i--)
        {
            stringstream ss; // recreate
            ss << 1;
        }
    }
    auto const p3{high_resolution_clock::now()};
    cout << duration_cast< milliseconds >(p2 - p1).count() << "ms "
        << duration_cast< milliseconds >(p3 - p2).count() << "ms" 
        << endl;

    return 0;
}

第一次循环35ms,第二次431ms