我应该担心多余的声明吗?

时间:2019-11-29 03:39:58

标签: c++ performance declaration

for(int i = 0; i < 10; ++i){
    int x = 0;
    //stuff
}

vs

int x;
for(int i = 0; i < 10; ++i){
    x = 0;
    //stuff
}

我担心性能和内存使用情况。

4 个答案:

答案 0 :(得分:3)

现代编译器在后台进行了大量优化。您可能会觉得第一个示例没有性能,因为它为每次迭代创建了providedIn: 'root' ,但事实并非如此。

第一个示例:https://godbolt.org/z/T2bsvG

第二个示例:https://godbolt.org/z/sRNjcV

如果编译程序集,则可以看到它们是相同的。

答案 1 :(得分:2)

  

我应该担心多余的声明吗?

通常,不会。

  

我担心性能和内存使用情况。

您可以将一种方式的程序集与另一种方式的程序集进行比较,并可能会发现生成的程序是相同的。如果不是这样,那么您可以衡量性能。但我怀疑实践中的性能可能没有差异。

将变量的范围限制为尽可能狭窄通常是使程序易于理解的最佳实践。

答案 2 :(得分:1)

如果您是要进行范围界定的问题,那么是的,在某些情况下(尤其是在处理智能指针时),是否需要使用变量很重要在使用范围内或存在于该范围之外。

您可能知道,在C ++中拥有智能指针的原因是为了协助资源管理,从而不必释放堆内存。

请参阅: What is a smart pointer and when should I use one?

例如,如果您有用于封装对数据库连接的引用的智能指针,而您必须调用使用该连接的函数。这真的很重要,因为如果智能指针位于函数内部,则每次调用此函数时都会打开和关闭连接,这可能会浪费您宝贵的毫秒级,并且根据调用频率而定浪费了数小时的时间。但是,如果它位于函数外部,则无论何时调用该函数,数据库都已经打开,而无需再次打开它。

我的经验法则是尝试尽可能多地延迟创建任何变量,直到需要它为止。毫无疑问,在某些情况下,如您在上面所述的情况下,它实际上并不重要,有些人喜欢代码的美感,即在一处声明变量然后使用它们。

答案 3 :(得分:1)

在性能方面,而不是int x = 0;可以考虑MyType x = 0;MyType的构造函数需要大量的工作。在这种情况下,在进入循环之前创建一次x比每次在循环中创建x的工作量要少。但是,如果程序逻辑每次在循环中都需要一个新的x,则在进入循环之前创建一个单独的逻辑将是错误的。