a7g*_*ger 0 c++ loops stringstream clear
在我的学校,我们必须遵循一种样式指南,该指南指出必须在使用变量的函数顶部声明每个变量,而不是在使用变量之前声明。这通常意味着您必须在循环内使用变量时重置或清除变量,因为它们未在该循环内声明。我不明白为什么每次循环迭代都需要“清除” stringstream变量,并希望有人对此有所了解。我知道如何清除它,只是想知道为什么有必要。
其基本原理是在循环内部创建沉重的对象会导致性能下降。::std::stringstream是这些对象之一,并且始终创建和销毁字符串流是一个常见的错误。但是,这样的规则不适用于轻型对象,例如基本类型。
考虑一下测试用例:
#include <chrono>
#include <sstream>
#include <iostream>
#include <cstdlib>
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 EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
第一循环35ms,第二循环431ms