如何处理条件初始化,这是一个好习惯吗?

我试图在几种可能的做法之间做出决定。 比方说,我的函数有许多if()块,它们处理数据,这对它们来说是唯一的。

  • 我应该声明并初始化块内的本地(用于块)数据吗? 这是否具有运行时性能成本(由于堆栈中的运行时分配)?

  • 或者我应该在函数入口处声明和/或初始化所有变量,以便在一个可能更快的操作块中完成?

  • 或者我应该在不同的函数中分隔if()块,即使它们只有几行而且在程序中只使用了一行?

或者我是否正在开发另一种更清洁的选择? 这个问题是否以当前的一般forms回答?

我应该声明并初始化块内的本地(用于块)数据吗?

绝对:这往往会使程序更具可读性。

这是否具有运行时性能成本(由于堆栈中的运行时分配)?

否:所有分配都是预先完成的 – 堆栈上的空间在进入函数时保留给所有分支中的变量,而不是在输入分支时。 而且,这甚至可以节省一些空间,因为编译器可以重用为非重叠分支中的变量分配的空间。

或者我应该在函数入口处声明和/或初始化所有变量,以便在一个可能更快的操作块中完成?

不,这不是更快,可能会稍微浪费一点。

或者我应该在不同的函数中分隔if()块,即使它们只有几行而且在程序中只使用了一行?

这可能会对您的程序的可读性产生负面影响。

保持变量范围尽可能小是一种很好的做法。
如果您在开头声明所有变量一次,并且您不使用
他们经常在你的程序中。 这没用,需要更多的内存。

此外,保持范围小的另一个优点是可以重复使用
同样的名字。 (每次你都不必发明新的名字
做一些微不足道的事情)。

在您说明的选项中,声明并初始化块中的本地(对于块)数据将满足您的目的。 忘记其余的事情吧。

为了完整; 另一个,通常不那么重要的考虑因素是堆栈填充控制/打包,如果你没有事先声明所有内容,这在直觉上会更加困难。

有关更多信息,请参阅此内容,但在任何人做任何事情之前让我强调以下段落:

通常,对于C程序中的少量标量变量,通过更改声明的顺序来消除可以获得的少量字节将不会为您节省足够的重要性。 当应用于非标量变量时,该技术变得更有趣 – 尤其是结构。

现在关于表现的答案。

我应该声明并初始化块内的本地(用于块)数据吗? 这是否具有运行时性能成本(由于堆栈中的运行时分配)?

局部变量的分配几乎是免费的。 在大多数情况下,它实际上是免费的,因为堆栈指针的更新是在将值写入堆栈的相同指令中执行的。 释放也是自由的(当某些东西从堆栈中弹出时),或者在返回时完成一次(当创建堆栈帧时)。

或者我应该在函数入口处声明和/或初始化所有变量,以便在一个可能更快的操作块中完成?

虽然分配几乎是免费的,但运行构造函数/析构函数却不是。 虽然这不适用于基本类型的变量,但它几乎适用于所有用户定义的类型,包括智能指针等。 如果在函数的开头声明一个智能指针,但只使用它一半的时间,那么构造,然后根据需要将智能指针的两次破坏。

此外,如果您声明一个变量,其中您有信息可以根据需要对其进行初始化,您可以将其直接构造为您希望它具有的状态,而不是首先默认构造它只是为了之后更改它的值(使用赋值运算符)很多情况)。 因此,从性能角度来看,您应该总是迟到并且只在需要它们的块中声明变量。

或者我应该在不同的函数中分隔if()块,即使它们只有几行而且在程序中只使用了一行?

不,从性能角度来看,这完全是反作用的。 每个函数调用都有一个开销,我认为它大多数时间在10到20个周期之间。 你可以在那段时间做很多计算。