在我的代码中,有时会有一个很长的函数,为了避免弄乱局部变量,我会使用一对大括号来包含细节,这样局部变量就不会对代码的其余部分可见,例如: / p>
bool pricing_deals()
{
//prepare deal type lookup table
vector<DealType> deal_types; // deal type lookup table
{
vector<DealType> deal_types_TRF;
vector<DealType> deal_types_DCI;
...
// code that prepare deal_types by merging deal_types_TRF and deal_types_DCI etc
}
// from now on deal_types_TRF and deal_types_DCI are invisible
//prepare ccy pair lookup table
vector<CcyPair> ccy_pairs; // ccy pair lookup table
{
// code that prepare ccy_pairs;
}
// from now on local variables preparing ccy_pairs are invisible
// real computation starts
...
}
我想知道这是不是一个好习惯,还是有其他方法这样做你会建议吗?
P.S。在这种情况下,我不希望将其分解为更小的函数,因为子逻辑不太可能被其他人重用,并且重构将导致大量参数被传递,这将增加复杂性。
答案 0 :(得分:1)
在某些情况下这是一个很好的做法,如果你不能将函数拆分成多个较小的函数,但是你必须意识到当局部变量超出范围时,它的析构函数被调用,这可能是也可能不是问题,例如,如果你想像:
#include <iostream>
#include <vector>
#include <string>
int main(int argc, const char* argv[])
{
using namespace std;
vector<string>::const_iterator it;
{
const vector<string> data = {"foo", "bar", "baz"};
it = data.begin();
}
cout << *it << endl;
return 0;
}
然后在这里将const_iterator
存储到vector
,当范围关闭时释放该vattr
,以便获得未定义的行为。这并不意味着您的解决方案不是一个好的解决方案,它只是意味着您必须考虑到任何特定的缺点。
如果您需要在函数的多个部分中分配许多资源,这样也很好,这样您就可以逐步分配和释放它们而无需任何内存峰值。