2017-04-16 73 views
0

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

+2

你的风格指南是疯了。 – melpomene

+0

最佳做法通常与您的风格指南完全相反。 – Galik

+0

要回答你的问题,你能给一个可以评论的例子吗? – Galik

回答

4

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

考虑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

+0

谢谢!完美地回答了我的问题! – Zach

相关问题