如何隐藏局部变量
how to hide local variables
在我的代码中,有时会有一个很长的函数,为了避免弄乱局部变量,我会用一对大括号来包含细节,这样局部变量就不会对代码的其余部分可见,例如:
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。在这种情况下,我不希望把它分解成更小的功能,因为子逻辑不太可能被其他人复用,重构会导致很多参数被传递,这会增加复杂度。
在某些情况下,如果您不能将函数拆分为多个较小的函数,这是一个很好的做法,但您必须知道,当局部变量超出范围时,它的析构函数将被调用,这可能是也可能是没问题,例如,如果您假设是这样的:
#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
中,它在范围关闭时被释放,所以你会得到未定义的行为。这并不意味着您的解决方案不是一个好的解决方案,它只是意味着您必须考虑到任何特定的缺点。
如果您需要在一个函数的多个部分分配很多资源,这样您就可以逐渐分配和释放它们,而无需内存峰值,这也很好。
在我的代码中,有时会有一个很长的函数,为了避免弄乱局部变量,我会用一对大括号来包含细节,这样局部变量就不会对代码的其余部分可见,例如:
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。在这种情况下,我不希望把它分解成更小的功能,因为子逻辑不太可能被其他人复用,重构会导致很多参数被传递,这会增加复杂度。
在某些情况下,如果您不能将函数拆分为多个较小的函数,这是一个很好的做法,但您必须知道,当局部变量超出范围时,它的析构函数将被调用,这可能是也可能是没问题,例如,如果您假设是这样的:
#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
中,它在范围关闭时被释放,所以你会得到未定义的行为。这并不意味着您的解决方案不是一个好的解决方案,它只是意味着您必须考虑到任何特定的缺点。
如果您需要在一个函数的多个部分分配很多资源,这样您就可以逐渐分配和释放它们,而无需内存峰值,这也很好。