我目前正在审核代码,并且有许多不同大小的局部变量。
以增加的大小顺序声明优先顺序,反之亦然。
在任一场景中用内存布局解释它。
是根据声明的顺序还是根据大小为本地变量分配内存。
int fun()
{
struct *ptr;
int var1;
long double *ld;
.
.
.
.
}
答案 0 :(得分:3)
在C ++中声明(和初始化)局部变量的最佳位置正好在它首次需要时。
变量的大小根本不应该是一个考虑因素,除非你有相反的具体证据。
答案 1 :(得分:1)
编译器会在优化时对其认为合适的局部变量进行重新排序。简而言之,同一范围内的变量顺序并不重要。
然而,有什么好主意是在使用它的范围内声明局部变量,例如:
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);
...
}
}
虽然对于良好的优化编译器,从性能或内存占用的角度来看,这可能无关紧要(它将检测何时使用变量)。它仍然会使代码更具可读性,并避免在不同的范围内混合不相关的值,从而防止编译器警告未捕获到的一些愚蠢的错误(因为编译器不知道何时意外忘记重新使用的重新初始化变量,但它会知道你是否忘记初始化一个新变量。)
此外,在担心变量(或任何内容)时也很重要:记得打开编译器的警告,例如gcc的-Wall -Wextra
。另外,使用valgrind是个好主意(如果你可以让你的代码在具有valgrind的操作系统上运行)。
答案 2 :(得分:0)
我的方法是,我在范围的开头,在尽可能小的范围内声明局部变量,例如
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
}
对于不复杂的编译器,它有助于优化,对于用户来说,它有助于跟踪信息。此外,它有助于保持内存占用尽可能小,因为本地人超出了范围(原文如此!),即他们的析构函数被调用。