我试图在几种可能的做法之间做出决定。比方说,我的函数有许多if()块,它们处理数据,这对它们来说是唯一的。
我应该声明并初始化块内的本地(用于块)数据吗?这是否具有运行时性能成本(由于堆栈中的运行时分配)?
或者我应该在函数入口处声明和/或初始化所有变量,以便在一个可能更快的操作块中完成?
或者我应该在不同的函数中分隔if()块,即使它们只有几行而且在程序中只使用了一行?
或者我是否正在开发另一种更清洁的选择?这个问题是否能以当前的一般形式回答?
答案 0 :(得分:8)
我应该声明并初始化块内的本地(用于块)数据吗?
绝对:这往往会使程序更具可读性。
这是否具有运行时性能成本(由于堆栈中的运行时分配)?
否:所有分配都是预先完成的 - 堆栈上的空间在进入函数时保留给所有分支中的变量,而不是在输入分支时。此外,这甚至可以节省一些空间,因为编译器可以重用为非重叠分支中的变量分配的空间。
或者我应该在函数入口处声明和/或初始化所有变量,以便在一个可能更快的操作块中完成?
不,这不是更快,可能会稍微浪费一点。
或者我应该在不同的函数中分隔if()块,即使它们只有几行并且在程序中只使用了一行?
这可能会对您的计划的可读性产生负面影响。
答案 1 :(得分:4)
保持scope of the variable尽可能小是一个好习惯
如果您在开头一次声明所有变量,并且不使用
他们经常在你的程序中。这没用,需要更多的记忆。
另外,保持范围小的另一个好处是可以重复使用 同样的名字。 (每次你不必发明新的名字 做一些微不足道的事情)。
答案 2 :(得分:0)
在您声明的选项中,声明并初始化块中的本地(对于块)数据将满足您的目的。忘记其余的事情。
答案 3 :(得分:0)
为了完整;另一个,通常不那么重要的考虑因素是堆栈填充控制/打包,如果你没有事先声明所有内容,这在直觉上会更加困难。
有关详细信息,请参阅this,但在任何人做任何事情之前,请让我强调以下段落:
通常,对于C程序中的少量标量变量, 通过改变顺序来消除你可以得到的几个字节 声明不会为你留下足够的重要意义。技术 应用于非标量变量时变得更有趣 - 特别是结构。
答案 4 :(得分:0)
现在关于表现的答案。
我应该声明并初始化块内的本地(用于块)数据吗?这是否具有运行时性能成本(由于堆栈中的运行时分配)?
局部变量的分配几乎是免费的。在大多数情况下,它实际上是免费的,因为堆栈指针的更新是在将值写入堆栈的相同指令中执行的。释放也是自由的(当某些东西从堆栈中弹出时),或者在返回时完成一次(当创建堆栈帧时)。
或者我应该在函数入口处声明和/或初始化所有变量,以便在一个可能更快的操作块中完成?
虽然分配几乎是免费的,但运行构造函数/析构函数却不是。虽然这不适用于基元类型的变量,但它几乎适用于所有用户定义的类型,包括智能指针等。如果你在函数的开头声明了一个智能指针,但只使用它一半的时间,你构造,然后根据需要将智能指针两次破坏。
另外,如果你声明一个变量,你有信息可以根据需要对其进行初始化,你可以直接将它构造成你想要它的状态而不是首先默认构造它只是为了之后改变它的值(使用在很多情况下赋值操作符)。因此,从性能角度来看,您应该总是迟到并且只在需要它们的块中声明变量。
或者我应该在不同的函数中分隔if()块,即使它们只有几行并且在程序中只使用了一行?
不,从性能角度来看,这完全是一种反效果。每个函数调用都有一个开销,我认为它大多数时间在10到20个周期之间。你可以在那段时间做很多计算。