函数存储中的变量

variables in functions storage

本文关键字:变量 存储 函数      更新时间:2023-10-16

当我在函数中声明一些变量,然后在循环中调用该函数时,这些变量是否在每一步都被销毁和重建?这很糟糕,可以/应该避免吗?下面是我正在做的一个例子:

    void myfun(vector<double> &x){
         vector<double>y;
         y.resize(x.size());
         //computation
    }
    int main(){
        vector<double>x(3,0);
        for(int i=0;i<5000;i++)
        myfun(x);
    }  

是的,它们被销毁了。这还不错。

如果将static限定符放在函数中的变量上,则它不会每次都被销毁。否则,情况会是这样,但这并不一定是坏事。不要对速度进行优化,直到你真正知道有问题并知道是什么原因造成的。

这取决于你用它做什么,有时它别无选择,只能这么做。我想说的是,如果它是可重用的,你可以在外部声明"内部声明"变量,并将其作为函数的引用参数传递。

当我在函数中声明一些变量,然后调用它时循环中的函数,变量是否被破坏和重建在每一步?

函数可以由编译器内联,变量可以被优化,还有各种不可预测的东西,但你可以假设它们在每次函数调用时都被初始化和销毁。

这很糟糕,可以/应该避免吗?

大多数情况下,这是不可避免的,但在处理向量时,如果可能的话,必须始终尽量减少这种情况。

C++标准提供了一种称为"好像"规则的东西,它基本上说编译器可以对代码做任何它想做的事情,前提是你不能分辨出其中的区别。如果编译器观察到跳过构造函数和析构函数调用不会改变程序的行为,那么它可能会跳过它,或者在函数之外声明变量,或者如果它不改变程序行为,则根本不声明变量。这取决于执行的质量。尽管我不确定是否有编译器应用了这样的优化。

函数终止时,非静态局部变量将被销毁。你无法避免。如果希望避免每次输入函数时都创建它们,可以将它们声明为static,也可以将它们作为参数(通过引用或指针)传递。