我目前正在审查代码,并且有许多不同大小的局部变量。
是按大小递增的顺序声明更可取的一个,反之亦然。
在任何一种情况下都用内存布局来解释它。
是根据声明顺序或大小为局部变量分配的内存。
int fun()
{
struct *ptr;
int var1;
long double *ld;
.
.
.
.
}
在 C++ 中声明(和初始化)局部变量的最佳位置就在第一次需要它的地方。
变量的大小根本不应该是一个考虑因素,除非你有相反的具体证据。
编译器会在优化时重新排序局部变量。简而言之,同一范围内的变量顺序无关紧要。
不过,好主意是在使用它的范围内声明局部变量,例如:
void func() {
//int i, j; // not here!
for (int i = 0 ; i<10; ++i) {
int j = func2(i);
...
}
// i and j below are different variables than i and j above
// you can consider changing their names if they also have different meaning
for (int i = 0 ; i<10; ++i) {
int j = func3(i);
...
}
}
尽管对于良好的优化编译器,从性能或内存占用的角度来看,这可能无关紧要(它会检测到何时使用变量)。它仍然会使代码更具可读性,并避免在不同范围内混合不相关的值,从而防止编译器警告未捕获的一些愚蠢错误(因为编译器不知道您何时意外忘记重新初始化重用变量,但它会知道你是否忘记初始化一个新变量)。
另外,担心变量(或任何东西)时很重要的一点:记得打开编译器的警告,比如-Wall -Wextra
gcc。此外,使用valgrind是个好主意(如果您可以让您的代码在具有 valgrind 的操作系统上运行)。
我的方法是,我在尽可能小的范围内声明局部变量,在范围的开头,例如
void foo()
{
int local1 = 42;
int local2 = bar(local1);
if ( local2 != local1)
{
double local3 = double(local2)/double(local1);
MyMemoryAllocatingObject mmao; // large memory allocation, deallocation in destructor
baz(local3);
bat(mmao);
} // mmao memory gets freed here
}
对于不复杂的编译器,它有助于优化,对于用户,它有助于跟踪信息。另外,它有助于使内存占用尽可能小,因为局部变量超出范围(原文如此!),即调用了它们的析构函数。