当我在函数内声明一些变量然后在循环中调用该函数时,变量是在每一步被破坏和重建的吗?是那么糟糕,可以/应该避免吗?这是我正在做的一个例子:
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);
}
答案 0 :(得分:1)
答案 1 :(得分:1)
如果将static
限定符放在函数中的变量上,那么每次都不会销毁它。否则,它会,但这不一定是坏的。在你真正知道存在问题并知道是什么导致问题之前,不要对速度进行优化。
答案 2 :(得分:0)
取决于你正在做什么,有时它别无选择,只能这样做。我的意思是说,如果它是可重用的,你可以在外部声明“内部声明的”变量,并将其作为参数传递给函数。
答案 3 :(得分:0)
当我在函数中声明一些变量然后调用它时 循环中的函数是被破坏和重建的变量 在每一步?
您的编译器可以内联函数,优化掉的变量和所有类型的不可预测的东西,但您可以假设它们在每次函数调用时都被初始化和销毁。
那是不是可以/应该避免?
大部分时间都是不可避免的,但如果可能的话,你必须在处理向量时尽量减少这种情况。
答案 4 :(得分:0)
C ++标准提供了一种称为“as-if”规则的东西,它基本上表示编译器可以使用代码执行任何需要的操作,前提是您无法区分它们。如果编译器观察到跳过构造函数和析构函数调用没有改变程序的行为,它可能会跳过它,或者在函数之外声明变量,或者根本不声明它,如果它不改变程序的行为。 这取决于实施的质量。虽然我不确定是否有任何编译器应用此类优化。
答案 5 :(得分:0)
当函数终止时,会破坏非静态局部变量。你无法避免它。
如果你想在每次输入函数时都避免创建它们,你可以声明它们static
或者只是将它们作为参数传递(通过引用或指针)。